# 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)
なぜ
になるのでしょうか?代わりに私は何をすべきですか?# 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)
なぜ
になるのでしょうか?代わりに私は何をすべきですか?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のタプル]の
ああ、そう、私の'Point(2,3)'は 'Point'で' __new__'メソッドを探して見つからず、 'tuple____ new __(Point、2,3)'を呼び出します。ユーザ定義クラスのように '__init__'への引数は実際に' tuple'を正しく初期化するためには1つのイテレータを必要としますが、正しいのでしょうか?コードは 'Point .__ init __(self、2、3)'呼び出しにも到達しません。 'tuple'は' __init__'を持たないので、呼び出しがあったとしても間違っているので、 'object .__ init__'は何もしません。 – max
はい。オブジェクトはすでに作成されています。 – user225312
可能複製(http://stackoverflow.com/questions/1565374/subclassing-python-tuple-with-multiple-init-arguments) –