Python:如何使用多重继承调用多个超级__new__?

时间:2018-03-10 18:01:00

标签: python

我有两个类:AB,它们都由__new__实例化,具有不同的参数集(例如a用于A,以及foo, bar的{​​{1}}。现在我想实现继承自BC的类A,并使用3个args:B实例化它,将相应的参数传递给超类a, foo, bar ,但这里出了问题。

如果我们没有参数,我只需调用__new__并成功创建类super(C, cls).__new__()的对象(它同时调用CA.__new__()并以某种方式组合它)。但如何用手做?#39;所以我想将B.__new__()传递给aA.__new__传递给foo, bar,并以某种方式结合返回的实例(这是获取类B.__new__对象的正确方法结束?)。

无论如何,我无法做到这两点。

Fist - 调用C会在A.__new__中的o = super(A, cls).__new__(cls)中引发错误的参数数量异常(但A.__new__()可以单独实例化)

第二 - 我不知道如何将成功实例化的类AA的对象组合到类B的对象中。

那么可以请某人解释这里发生了什么?

C

1 个答案:

答案 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__