__init__
を、Javaのコンストラクタとは異なり、自動的に継承階層内のすべてのクラスには呼び出されません - あなたはトンを必要とします自分でやってください。
また、すべてのオブジェクト階層は、特別な場合を除いてobject
に根ざしている必要があります。
あなたのコードは次のようになります。
class Person(object):
def __init__(self, name, phone):
self.name = name
self.phone = phone
class Teenager(Person):
def_init_(self, name, phone, website):
super(Teenager, self).__init__(name, phone)
self.website=website
super
は、それぞれの名前(「メソッド解決順序のために呼び出すべき関数のリスト内の次の関数を呼び出します2番目の引数(self
)、のためのデリゲートを作成します")。これは、Javaで起こるように、スーパークラスメソッドを呼び出すこととまったく同じではありません。
super(type(self), self).__init__(name, phone)
と書くこともできますが、このクラスからさらに継承すると、type(self)
はTeenager
にならない場合があり、無限の再帰を持つ可能性があります。これは、スーパークラスのコンストラクタを直接呼び出すのではなく、MROの差を持つデリゲートオブジェクトを使用しているという事実の実用的な結果の1つです。
class Teenager(Person):
def __init__(self, *args, **kwargs):
self.website=kwargs.pop('website')
super(Teenager, self).__init__(*args, **kwargs)
それはこの場合には大きな違いがありませんが、あなたは、引数のトンと__init__
を持っている場合、それは楽になります:
Python 2.xを使用している場合、 'super'を使うために' Person'の基本クラスとして 'object'を明示的に指定する必要があることに注意してください。それ以外の場合は、 'Person .__ init__'フォームを使用する必要があります。 – chepner
@chepnerあなたはそれについての参考資料を提供できますか?私は1つを見つけることができません。 – murgatroid99
http://docs.python.org/library/functions.html#superは、super()が新しいスタイルのクラスでのみサポートされていることを示しています。Python 2.xでは 'object'から継承するクラスです。 – chepner