これの正しいイディオムは何ですか?
(オプションで) dict から初期化できるプロパティを含むオブジェクトを定義したい (dict は JSON に由来する; 不完全かもしれない)。後で、セッターを介してプロパティを変更することがあります。実際には13以上のプロパティがあり、デフォルトのゲッターとセッターを使用できるようにしたいのですが、この場合はうまくいかないようです:
しかし、すべてに対して明示的な記述子を記述する必要はありません。prop1... propn
また、デフォルトの割り当てを__init__()
アクセサーから出し入れしたいのですが、明示的な記述子が必要になります。
最もエレガントなソリューションは何ですか? __init__()
(すべてのセッター呼び出しをメソッド/クラスメソッドから出し入れする以外に_make()
?)
[削除されたコメント デフォルト記述子を使用する badprop のコードは、以前の SO ユーザーによるコメントによるもので、デフォルト セッターを提供するという印象を与えました。しかし、そうではありません-セッターは未定義であり、必然的にスローされAttributeError
ます。]
class DubiousPropertyExample(object):
def __init__(self,dct=None):
self.prop1 = 'some default'
self.prop2 = 'other default'
#self.badprop = 'This throws AttributeError: can\'t set attribute'
if dct is None: dct = dict() # or use defaultdict
for prop,val in dct.items():
self.__setattr__(prop,val)
# How do I do default property descriptors? this is wrong
#@property
#def badprop(self): pass
# Explicit descriptors for all properties - yukk
@property
def prop1(self): return self._prop1
@prop1.setter
def prop1(self,value): self._prop1 = value
@property
def prop2(self): return self._prop2
@prop2.setter
def prop2(self,value): self._prop2 = value
dub = DubiousPropertyExample({'prop2':'crashandburn'})
print dub.__dict__
# {'_prop2': 'crashandburn', '_prop1': 'some default'}
self.badprop = ...
5 行目のコメントを外してこれを実行すると、失敗します。
self.badprop = 'This throws AttributeError: can\'t set attribute'
AttributeError: 属性を設定できません
[いつものように、ディスクリプタ、暗黙のディスクリプタに関する SO の投稿を読み、initから呼び出します]