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>

このエラーが発生する理由がわかりません。rad 値 1 を指定していますが、x と y の値を指定していないため、Circle はデフォルト値の x=0 と y=0 を使用し、super() を介して Shape に渡す必要があると想定します。関数。私は何が欠けていますか?

ところで、私は Python 2.7.1 を使用しています。

ありがとう。

4

4 に答える 4

7

super引数が必要であり、これはまさにエラーメッセージが言っていることです。あなたの場合、あなたはとを使う必要がありsuper(Circle, self)ますsuper(Square, self)

残酷な詳細については、このSOの質問を参照するか、公式ドキュメントを確認してください。

あなたが面白いことをしたいのでなければ、コードはで単純化できることに注意してください

Shape.__init__(self, x, y)

両方の場合において。あなたが理解superし、なぜそれが役立つのかを理解するまで、私は単にそれから離れることを提案します。それに触れることなく、生産的なPythonプログラマーとして幸せな生活を送ることができます。

于 2012-09-25T05:47:45.360 に答える
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 に答える