我有两个课,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()
:
"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
方法一样。
__init__
预期Field将处理具有不带参数的buildField方法的对象。您将该方法与具有带有一个参数的buildField方法的对象一起使用。
问题super
是它不会更改对象的类型,因此您不应更改超类的方法可能调用的任何方法的签名。
如何/可以重写来自非继承类的方法?其次,有没有比“非继承类”更好的术语? 我有一个“扩展”JFrame的类,需要从JPanel重写paintComponent。怎么做?或者它可以扩展JPanel,并需要访问方法,如setTitle()、setResizable()和setDefaultCloseOperation();
我正在编写一个带有对象的游戏,我想根据它的类使用不同的命令。我有一个超级类“项目”,一个子类“工具扩展项目”和“锤子扩展工具”。在项目超类(抽象)中,我有一个抽象方法“doCommand”,我在工具中覆盖了它。这很好用,我现在在工具中有一个有效的“doCommand”。但是当我想在 Hammer 中覆盖这个“doCommand”时,它只是使用工具的“doCommand”。 这来自调用方法的类的一部
问题内容: 我想创建一个只能接受某些类型的列表。因此,我试图从Python中的列表继承,并像这样覆盖append()方法: 这将导致无限循环,因为append()的主体会自行调用,但是除了使用self.append(item)外,我不确定该做什么。 我应该怎么做呢? 问题答案: 我对你的课做了一些改动。这似乎正在工作。 一些建议:不要用作关键字-是内置函数。使用前缀访问Python实例变量。所以用
“编写一个名为clsWorker的超类和子类clsHourlyWorker和clssalariedworker。每个工人都有一个名字和一个工资率。编写计算每个员工周薪的方法computePay(int hours)。小时工按实际工作小时数获得小时工资,如果小时数最多为40小时。如果小时工工作超过40小时,则按时间半支付超出部分。受薪工人得到40小时的小时工资,无论实际小时数是多少。为继承编写一个测
我创建了一个(个人、学生、员工、教职员工)类。Person必须将Student和Employee分为子类。Employee有两个子类:教员和职员。我已经完成了所有的编码,他们工作得很好,除了我的驱动程序类TestPerson程序给出了编译错误 注:一个测试程序,创建一个人、学生、员工、教职员工,并调用他们的toString方法。 驱动程序类TestPerson的错误。以下是java:- **我只是
问题内容: 我正在Google App Engine中制作一个购物车应用。我有许多从基本处理程序派生的类: 这是否意味着每个后代类的方法都需要具有相同的参数?这很麻烦。实际上只有一个后代使用该参数。而当我添加新的参数时呢?我需要遍历每堂课吗? 问题答案: 重写的方法原则上不必彼此具有相同的参数,但是它们必须具有与调用它们相同的形式参数。因此,由于任何处理程序都可以通过调用它,是的,它们必须相同。就