のサブクラスの属性を設定することはできませんそれは私がnamedtuple
のサブクラスを作成し、異なる提供しようとしているthisまたはthisはやや関連スレッドですように見えますが、それでも物事を考え出したていない:)がnamedtuple
を私はさまざまな方法でオブジェクトを構築することができます。動作しません。しかし
>>> from collections import namedtuple
>>> class C(namedtuple("C", "x, y")) :
... __slots__ =()
... def __init__(self, obj) : # Initialize a C instance by copying values from obj
... self.x = obj.a
... self.y = obj.b
... def __init__(self, x, y) : # Initialize a C instance from the parameters
... self.x = x
... self.y = y
、:たとえば
>>> c = C(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in __init__
AttributeError: can't set attribute
一部突っつい周りの後に(例えば、thisスレッドを参照してください)私の代わりに初期化子のコンストラクタを使用しようとしました:
>>> from collections import namedtuple
>>> class C(namedtuple("C", "x, y")) :
... __slots__ =()
... def __new__(cls, obj) :
... self = super(C, cls).__new__(cls, obj.a, obj.b)
... def __new__(cls, x, y) :
... self = super(C, cls).__new__(cls, x, y)
オブジェクトを作成したようですが、その属性を読み取ることができません:
>>> c = C(1,2)
>>> c.x, c.y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'x'
ここで私は間違っていますか?複数のコンストラクタまたはイニシャライザを使用してサブクラスを作成するにはどうすればよいですか?
なぜ、 '__init__'と' __new__'メソッドが二重になっていますか? 2番目のものだけがカウントされ、最初のものを上書きします。 Pythonはメソッドシグネチャを「オーバーロード」しません。 –
オーバーロードがありません...つまり、Cのインスタンスを作成するという私の本来の目的は、(オーバーロードされたコンストラクタによって)実際に実行できません。 – Jens
これは完璧に実行可能で、異なるパラダイムを使用しています。 –