我有两个类:A
和B
,它们都由__new__
实例化,具有不同的参数集(例如a
用于A
,以及foo, bar
的{{1}}。现在我想实现继承自B
和C
的类A
,并使用3个args:B
实例化它,将相应的参数传递给超类a, foo, bar
,但这里出了问题。
如果我们没有参数,我只需调用__new__
并成功创建类super(C, cls).__new__()
的对象(它同时调用C
和A.__new__()
并以某种方式组合它)。但如何用手做?#39;所以我想将B.__new__()
传递给a
,A.__new__
传递给foo, bar
,并以某种方式结合返回的实例(这是获取类B.__new__
对象的正确方法结束?)。
无论如何,我无法做到这两点。
Fist - 调用C
会在A.__new__
中的o = super(A, cls).__new__(cls)
中引发错误的参数数量异常(但A.__new__()
可以单独实例化)
第二 - 我不知道如何将成功实例化的类A
和A
的对象组合到类B
的对象中。
那么可以请某人解释这里发生了什么?
C
答案 0 :(得分:3)
方法__new__
是创建实例的方法,不应多次调用super(...).__new__
,因为它会创建多个实例。
您要执行的操作使用__init__
来初始化您已创建的实例。
class A(object):
def __init__(self, a):
self.a = a
class B(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
class C(A, B):
def __init__(self, a, foo, bar):
A.__init__(self, a)
B.__init__(self, foo, bar)
特别是,我想指出,在多重继承上,Python不会同时调用A.__new__
和B.__new__
以及“以某种方式结合”。看看这段代码
class A(object):
def __new__(*args):
print('A.__new__ was called')
return type(*args) # This is what ultimately creates every object in Python
class B(object):
def __new__(*args):
print('B.__new__ was called')
return type(*args)
# As expected the following is printed when instances are created
a = A() # Prints 'A.__new__ was called'
b = B() # Prints 'B.__new__ was called'
class C(A, B):
pass
c = C() # Prints 'A.__new__ was called'
所以我们观察到B.__new__
从未被调用过。在多重继承上,Python将继承left-most class that has this method中的方法。在这种情况下,C
继承了A.__new__
。