我有两个课,Field和Background。它们看起来像这样:
Field
Background
class Field( object ): def __init__( self, a, b ): self.a = a self.b = b self.field = self.buildField() def buildField( self ): field = [0,0,0] return field class Background( Field ): def __init__( self, a, b, c ): super(Background, self).__init__( a, b ) self.field = self.buildField( c ) def buildField( self, c ): field = [c] return field a, b, c = 0, 1, 2 background = Background( a, b, c )
此错误指向Field的buildField():
buildField()
"TypeError: buildField() takes exactly 2 arguments (1 given)."
我希望首先调用Background init ()。要将“ a,b”传递给Fields的 init (),Field会分配a和b,然后将其中包含三个0的列表分配给field。然后让Background的 init ()继续,然后调用它自己的buildField()并用包含c的列表覆盖self.field。
似乎我还没有完全理解super(),但是在网上和附近浏览类似的继承问题后,我找不到解决方案。
我期望像c ++这样的行为,其中一个类可以覆盖继承的方法。我怎样才能做到这一点或类似的东西。
我发现与此相关的大多数问题是使用双下划线的人。我对super进行继承的经验是使用继承的类 init ()只是将不同的变量传递给super类。不涉及覆盖任何内容。
从C ++的角度来看,这里可能存在两个误解。
首先,具有相同名称和不同签名的方法不会像C ++中那样重载它。如果您的Background对象之一试图不带任何参数调用buildField,则不会调用Field的原始版本-它已被完全隐藏。
第二个问题是,如果超类中定义的方法调用buildField,则将调用子类版本。在python中, 所有 方法都是动态绑定的,就像C ++virtual方法一样。
virtual
__init__预期Field将处理具有不带参数的buildField方法的对象。您将该方法与具有带有一个参数的buildField方法的对象一起使用。
__init__
问题super是它不会更改对象的类型,因此您不应更改超类的方法可能调用的任何方法的签名。
super