、私は重く、そのようなクラスを使用するコードをクリーンアップしたいと思います:私は__getattr__
表記を維持されませんが、あるコンストラクタ引数を追加したい何オブジェクトのような__getattr__と辞書ですが、
class ADict(object):
pass
#example usage
a = ADict()
a.attr = 1
許可されたADictキーのリストは、__getattr__
と__setattr__
でチェックされます。それが良いアイデアかどうかとは別に、それは実行可能ですか?どうやって?ここに私の失敗した(ので、無限再帰の動作しません)です:
class ADict(object):
def __init__(self, keys):
object.__init__(self)
self.keys = keys
def __getattr__(self, attr):
print('hi1')
if attr not in object.__getattribute__(self.keys):
raise KeyError()
return object.__getattr__(self, attr)
def __setattr__(self, attr, value):
print('hi2')
if attr not in object.__getattribute__(self.keys):
raise KeyError()
return object.__setattr__(self, attr, value)
a = ADict(['a'])
a.b = 2
'もしattrがオブジェクトにないなら.__ getattribute __(self.keys):'なぜattrがself.keys'にないのですか?トレースバックを含む[mcve]を提供できますか? – jonrsharpe
'namedtuple'を試してみませんか? – shx2
@jonrsharpe:トレースバックには、再帰の上限に達したというメッセージがあります。私は "self.keys"と書くのを避けようとしていましたが、とにかく私はそれをやりました。 – d33tah