我看到了一些关于这个话题的问题,但是我没有找到一个明确的答案。
我想知道在新 Python 代码库中如何正确使用旧风格类。例如,假设我有两个固定的类 A 和 B。如果我想要继承 A 和 B,并转换为新风格类 (A2 和 B2),那么这是可以的。然而,如果我想要创建一个新的类 C,它来自于 A2 和 B2,就会出现问题。
因此,是否有可能继续使用这种方法,或者所有的类都必须符合旧风格,只要有任何一个基类被定义为旧风格?
请参考以下示例代码以获得更清晰的理解:
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
时,正确的初始化顺序并不清楚。这里有一个工作示例,其中对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