小编典典

Python,重写继承的类方法

python

我有两个课,FieldBackground。它们看起来像这样:

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()

"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类。不涉及覆盖任何内容。


阅读 185

收藏
2021-01-20

共1个答案

小编典典

从C ++的角度来看,这里可能存在两个误解。

首先,具有相同名称和不同签名的方法不会像C
++中那样重载它。如果您的Background对象之一试图不带任何参数调用buildField,则不会调用Field的原始版本-它已被完全隐藏。

第二个问题是,如果超类中定义的方法调用buildField,则将调用子类版本。在python中, 所有 方法都是动态绑定的,就像C
++virtual方法一样。

__init__预期Field将处理具有不带参数的buildField方法的对象。您将该方法与具有带有一个参数的buildField方法的对象一起使用。

问题super是它不会更改对象的类型,因此您不应更改超类的方法可能调用的任何方法的签名。

2021-01-20