我可以为多个属性使用相同的@property setter吗?

时间:2015-06-16 12:55:53

标签: python getter-setter python-decorators

我的类有许多属性都需要使用相同类型的setter:

@property
def prop(self):
    return self._prop

@prop.setter
def prop(self, value):
    self.other_dict['prop'] = value
    self._prop = value

是否有一种简单的方法可以将此setter结构应用于许多不涉及为每个属性编写这两种方法的属性?

1 个答案:

答案 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和类实例中的不同值引起的潜在问题 - 这可能很容易发生在您当前的方案中。