我的类有许多属性都需要使用相同类型的setter:
@property
def prop(self):
return self._prop
@prop.setter
def prop(self, value):
self.other_dict['prop'] = value
self._prop = value
是否有一种简单的方法可以将此setter结构应用于许多不涉及为每个属性编写这两种方法的属性?
答案 0 :(得分:2)
您可以使用descriptor实现此目的,即如下:
class MyProperty(object):
def __init__(self, name):
self.name = name
def __get__(self, instance, owner):
if instance is None:
return self
else:
# get attribute from the instance
return getattr(instance, '_%s' % self.name) # return x._prop
def __set__(self, instance, value):
# set attribute and the corresponding key in the "remote" dict
instance.other_dict[self.name] = value # x.other_dict["prop"] = value
setattr(instance, '_%s' % self.name, value) # x._prop = value
使用它们如下:
class MyClass(object):
prop = MyProperty("prop")
another_prop = MyProperty("another_prop")
作为旁注:可能值得考虑是否确实需要复制属性值。您可以通过从_prop
返回相应的值来轻松完全删除other_dict
属性。这也避免了存储在dict和类实例中的不同值引起的潜在问题 - 这可能很容易发生在您当前的方案中。