このトピックに関するいくつかの質問を見てきましたが、決定的な答えを見つけることができませんでした。
新しい Python コード ベースで古いスタイルのクラスを使用する適切な方法を知りたいです。たとえば、AとBという 2 つの固定クラスがあるとします。AとBをサブクラス化し、新しいスタイルのクラス ( A2とB2 ) に変換したい場合、これは機能します。ただし、 A2とB2から新しいクラスCを作成したい場合は問題があります。
したがって、この方法を続行することは可能ですか、それとも基本クラスが古いスタイルとして定義されている場合、すべてのクラスが古いスタイルに準拠する必要がありますか?
明確にするためのコード例を参照してください。
class A:
def __init__(self):
print 'class A'
class B:
def __init__(self):
print 'class B'
class A2(A,object):
def __init__(self):
super(A2, self).__init__()
print 'class A2'
class B2(B,object):
def __init__(self):
super(B2, self).__init__()
print 'class B2'
class C(A2, B2):
def __init__(self):
super(C,self).__init__()
print 'class C'
A2()
print '---'
B2()
print '---'
C()
このコードの出力:
class A
class A2
---
class B
class B2
---
class A
class A2
class C
ご覧のとおり、問題は への呼び出しでC()
、クラスB2が初期化されていないことです。
更新 - 新しいスタイルのクラスの例
を使用するときの正しい初期化シーケンスがどうあるべきかは明確ではないと思いますsuper
。これは、スーパーへの呼び出しが最初に見つかったものだけでなく、すべての基本クラスを初期化する実際の例です。
class A(object):
def __init__(self):
super(A, self).__init__()
print 'class A'
class B(object):
def __init__(self):
super(B, self).__init__()
print 'class B'
class A2(A):
def __init__(self):
super(A2, self).__init__()
print 'class A2'
class B2(B):
def __init__(self):
super(B2, self).__init__()
print 'class B2'
class C(A2, B2):
def __init__(self):
super(C, self).__init__()
print 'class C'
C()
そして出力を生成します:
class B
class B2
class A
class A2
class C