基本(スーパー)クラスを初期化するにはどうすればよいですか?
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')