基本(スーパー)クラスを初期化するにはどうすればよいですか?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
super
オブジェクトを使用して、メソッド解決順序で次のメソッドを(バインドされたメソッドとして)確実に取得します。Python 2では、クラス名を渡しself
、バインドされた__init__
メソッドを検索するためにスーパーする必要があります。
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
Python 3では、引数をsuper
不要にする小さな魔法があります-副次的な利点として、それは少し速く機能します:
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
以下のように親をハードコーディングすると、協調多重継承を使用できなくなります。
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
__init__
返さNone
れる可能性があることに注意してください-オブジェクトをインプレースで変更することを目的としています。
何か __new__
インスタンスを初期化する別の方法があります。これは、Pythonの不変型のサブクラスの唯一の方法です。あなたはサブクラスにしたいのであれば、それは必須ですstr
か、tuple
または別の不変オブジェクト。
暗黙のクラス引数を取得するため、それはクラスメソッドであると考えるかもしれません。しかし、それは実際には静的メソッドです。したがって__new__
、cls
明示的にで呼び出す必要があります。
通常はからインスタンスを返す__new__
ので、返す場合は、基本クラスで基本の__new__
via も呼び出す必要がありsuper
ます。したがって、両方の方法を使用する場合:
class SuperClass(object):
def __new__(cls, x):
return super(SuperClass, cls).__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super(SubClass, cls).__new__(cls)
def __init__(self, y):
self.y = y
super(SubClass, self).__init__('x')
Python 3は、__new__
静的メソッドであることによって引き起こされるsuper呼び出しの奇妙さを少し回避しますがcls
、非バインド__new__
メソッドに渡す必要があります。
class SuperClass(object):
def __new__(cls, x):
return super().__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super().__new__(cls)
def __init__(self, y):
self.y = y
super().__init__('x')