(Pythonの3では、すべてのクラスは、新しいスタイルのクラスである):
@property
def silly(self):
return self._silly
@silly.setter:
def silly(self, value):
self._silly = value
をしかし、これは新しいスタイルが必要ですクラスには、チェーンのどこかにclass ParentClass(object):
があるはずです。 silly = property(get_silly, set_silly)
を使用する同様のオプションにも同じ要件があります。
しかし、そこに別のオプションがあり、それは__getattr__
と__setattr__
方法をself._silly
のように、対応するプライベート変数を使用して、上書きすることです。
def __getattr__(self, name):
"""Called _after_ looking in the normal places for name."""
if name == 'silly':
self._silly
else:
raise AttributeError(name)
def __setattr__(self, name, value):
"""Called _before_ looking in the normal places for name."""
if name == 'silly':
self.__dict__['_silly'] = value
else:
self.__dict__[name] = value
__getattr__
がのためにチェックした後と呼ばれる方法をお知らせ他の属性をチェックする前に__setattr__
をと呼びます。の前に他の属性をチェックします。したがって、前者は受け入れられた属性ではない場合はエラーを発生させることができます。後者は属性を設定する必要があります。 はであり、self._silly = value
を__setattr__
とすると、無限再帰が発生します。
ここで旧式のクラスを扱っているので、実際にはdictメソッドを使用してください。baseclass.__setattr__(self, attr, value)
(docsを参照してください)。あなたが望むならば、同様の__delattr__()
も存在します。このコードを使用して
は、あなたが今のようなものを行うことができます。
i_am = Silly()
i_am.silly = 'No, I'm clever'
print i_am.silly
クラスシリー - >クラスシリー(オブジェクト)、およびそれが働きました。見逃した。ありがとうございました! – Locke