2

我有以下 code.py 文件:

class Shape:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def move(self, delta_x, delta_y):
        self.x += delta_x
        self.y += delta_y

class Square(Shape):
    def __init__(self, side=1, x=0, y=0):
        super().__init__(x, y)
        self.side = side

class Circle(Shape):
    def __init__(self, rad=1, x=0, y=0):
        super().__init__(x, y)
        self.radius = rad

我在 Python 解释器中运行代码,如下所示:

>>> import code
>>> c = code.Circle(1)

我收到此错误:

Traceback (most recent call last):<br>
...<br>
File "code.py", line 18, in __init__<br>
super().__init__(x, y)<br>
TypeError: super() takes at least 1 argument (0 given)<br>

我不明白为什么我会收到这个错误。我指定了 1 的 rad 值,我假设由于我没有指定 x 和 y 值,Circle 应该使用 x=0 和 y=0 的默认值,并通过 super() 将它们传递给 Shape功能。我错过了什么?

顺便说一句,我使用的是 Python 2.7.1。

谢谢。

4

4 回答 4

7

super需要一个参数,这正是错误消息所说的。在您的情况下,您需要使用super(Circle, self)and super(Square, self)

对于血腥的细节,你可以看到这个 SO question或者你可以查看官方文档。

请注意,除非您想做有趣的事情,否则代码可以简化为

Shape.__init__(self, x, y)

在这两种情况下。在您了解super它以及为什么它有用之前,我建议您远离它。作为一个高效的 Python 程序员,你可以过上幸福的生活,而无需碰它。

于 2012-09-25T05:47:45.360 回答
1

改为使用super(Shape, self),您可以help(super)在 python 中使用。

于 2012-09-25T05:42:31.833 回答
1

这是一些满足您需要的代码,您还需要使用“新样式类”,这意味着基类型需要从对象继承:

class Shape(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def move(self, delta_x, delta_y):
        self.x += delta_x
        self.y += delta_y

class Square(Shape):
    def __init__(self, side=1, x=0, y=0):
        super().__init__(x, y)
        self.side = side

class Circle(Shape):
    def __init__(self, rad=1, x=0, y=0):
        super(Circle, self).__init__(x, y)
        self.radius = rad

PS我只修复了Circle并留下了Square供您修复。

于 2012-09-25T05:48:58.163 回答
1

终于修好了。:D 搜索 python 文档和旧的 Stackoverflow 帖子以获得胜利。

class Shape(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def move(self, delta_x, delta_y):
        self.x += delta_x
        self.y += delta_y

class Square(Shape):
    def __init__(self, side=1, x=0, y=0):
        super(Square,self).__init__(x, y)
        self.side = side

class Circle(Shape):
    def __init__(self, rad=1, x=0, y=0):
        super(Circle,self).__init__(x, y)
        self.radius = rad

c = Circle(5)

这行得通。您需要通过使顶级父级(Shape)继承自对象来使用新的样式类。

参考: http ://docs.python.org/reference/datamodel.html#newstyle python中链调用父构造函数

于 2012-09-25T06:02:52.970 回答