2011-01-28 9 views
6
# Python 3 
class Point(tuple): 
    def __init__(self, x, y): 
     super().__init__((x, y)) 

Point(2, 3) 

問題サブクラス化する組み込み型の

TypeError: tuple() takes at most 1 argument (2 given)

なぜ

になるのでしょうか?代わりに私は何をすべきですか?

+2

可能複製(http://stackoverflow.com/questions/1565374/subclassing-python-tuple-with-multiple-init-arguments) –

答えて

10

tupleは不変型です。 __init__が呼び出される前に既に作成され、不変です。これがうまくいかない理由です。

実際にタプルをサブクラス化する場合は、__new__を使用してください。

>>> class MyTuple(tuple): 
...  def __new__(typ, itr): 
...    seq = [int(x) for x in itr] 
...    return tuple.__new__(typ, seq) 
... 
>>> t = MyTuple((1, 2, 3)) 
>>> t 
(1, 2, 3) 
[複数の__init__引数を持つサブクラスPythonのタプル]の
+1

ああ、そう、私の'Point(2,3)'は 'Point'で' __new__'メソッドを探して見つからず、 'tuple____ new __(Point、2,3)'を呼び出します。ユーザ定義クラスのように '__init__'への引数は実際に' tuple'を正しく初期化するためには1つのイテレータを必要としますが、正しいのでしょうか?コードは 'Point .__ init __(self、2、3)'呼び出しにも到達しません。 'tuple'は' __init__'を持たないので、呼び出しがあったとしても間違っているので、 'object .__ init__'は何もしません。 – max

+0

はい。オブジェクトはすでに作成されています。 – user225312

関連する問題