2

我有一个像

class A:
    def __init__(self, x):
        self.a=x

class B(A):
    def __init__(self, x):
        self.b=x

class C(A):
    def __init__(self, x):
        self.c=x

class D(B,C):
    def __init__(self, x):
        self.d=x

现在我想扩展__init__s 使得BC都可以调用A(B 和 C 可以用作独立类)。此外D,应该调用 A、B 和 C(D 结合了 B 和 C 的特征,但仍需要运行所有初始化)。都__init__采用相同的参数。显然 A 应该只被调用一次。

你看到一个简单的方法吗?

4

2 回答 2

6

使用super. 据我所知,这就是它的目的......

首先,一些建议阅读:

  • 超级被认为是有害的和超级的(同时——被不同的人)

接下来,一个例子:

class A(object):
    def __init__(self, x):
        print "Called A"
        self.a=x

class B(A):
    def __init__(self, x):
        print "Called B"
        super(B,self).__init__(x)
        self.b=x

class C(A):
    def __init__(self, x):
        print "Called C"
        super(C,self).__init__(x)
        self.c=x

class D(B,C):
    def __init__(self, x):
        print "Called D"
        super(D,self).__init__(x)        
        self.d=x


foo = D(10)

如评论中所述,您经常看到使用 super 定义的方法来接受任意数量的位置和关键字参数:

def mymethod(self,*args,**kwargs):
    super(thisclass,self).method(*args,**kwargs)
    ...

因为这允许super将必要/不必要的参数传递给继承链中的其他对象。然后这些方法可以决定他们需要哪些参数并忽略其余的(当然将它们传递给下一个super


最后,为了完成这个讨论,我们需要讨论 python2.x 与 python3.x。在 python2.x 中,你所有的类都必须是新样式(它们最终需要继承object)。在 python3.x 中,这是自动的。在 python3.x 中,您可以省略super.

 super().__init__(*args,**kwargs)

但是,我更喜欢 python2.x 样式,因为它适用于 python2.x 和 python3.x,我总是想知道super()(python3.x 样式)如何知道将什么对象传递给底层方法作为self. 对我来说,这似乎比 python2.x 版本更神奇......

于 2012-11-08T21:05:10.350 回答
2

使用super

class D(B, C):
    def __init__(self, *args, **kwargs):
        super(D, self).__init__(*args, **kwargs)
        self.d = args[0]

关于 super here相关问题的一些解释

在 Python 2 中,您还应该继承 fromobject以使用新样式类,并添加super到您的其他类中。

于 2012-11-08T21:11:09.607 回答