请问这个的正确成语是什么?
我想定义一个包含可以(可选)从字典初始化的属性的对象(字典来自 JSON;它可能不完整)。稍后我可能会通过设置器修改属性。实际上有 13+ 属性,我希望能够使用默认的 getters 和 setters,但这似乎不适用于这种情况:
但我不想为所有内容编写显式描述符prop1... propn
另外,我想将默认分配移出__init__()
和移入访问器......但是我需要显式描述符。
什么是最优雅的解决方案?(除了将所有 setter 调用移出__init__()
和移入方法/类方法_make()
?)
[删除评论 使用默认描述符的 badprop 的代码是由于以前的 SO 用户的评论,他给人的印象是它给了你一个默认的设置器。但它没有 - setter 是未定义的,它必然会抛出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'}
如果你在第 5 行self.badprop = ...
未注释的情况下运行它,它会失败:
self.badprop = 'This throws AttributeError: can\'t set attribute'
AttributeError:无法设置属性
[和以往一样,我阅读了关于描述符、隐式描述符、从init调用它们的 SO 帖子]