class Foo(object):
__slots__ = ('a',)
class Bar(Foo):
@property
def a(self):
return super(Bar, self).a
super(Bar, Bar()).a = 4
このコードを使用している場合、これは機能しません。
>>> super(Bar, Bar()).a = 4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'super' object has no attribute 'a'
なんで?
python docsによると、__slots__
実装されています:
__slots__
変数名ごとに記述子 (実装記述子) を作成することにより、クラス レベルで実装されます。その結果、クラス属性を使用して、によって定義されたインスタンス変数のデフォルト値を設定することはできません__slots__
。そうしないと、クラス属性が記述子の割り当てを上書きします。
ただし、記述子は継承に対応できます (少なくとも純粋な python で記述されている場合)。
なぜこれが機能しないのか、誰かが知ってい__slots__
ますか?
編集super()
:あなたが書き込もうとしている場合、記述子は一般的に で動作していないようです(ただし、読み取りは機能します)。したがって、私の質問は次のようになりsuper()
ます。