用于为多个属性定义@property的函数

时间:2015-08-17 01:45:58

标签: python lambda decorator

我正在尝试创建一个函数,它从类实例中获取可变数量的属性,并像使用@property一样重新定义它们,为属性提供getter和setter。

我想实现这个目标:

@property
def x(self):
    return self._x

@x.setter
def x(self, value):
    self._x = value

@property
def dx(self):
    return self._dx

@dx.setter
def dx(self, value):
    self._dx = value

@property
def dy(self):
    return self._dy

@dy.setter
def dy(self, value):
    self._dy = value

做这样的事情:

decorate_these_attributes(self.x, self.dx, self.dy)

这是我到目前为止所做的:

def decorate_these_attributes(self, *args):

    def attr_set(attr, val):
        attr = val

    for attr in args:
        attr_get = lambda: attr
        attr = property(attr_get, attr_set)

截至目前,当我调用该函数时,它什么也没做。对我做错了什么想法?

1 个答案:

答案 0 :(得分:2)

您可以使用类装饰器或元类来执行以下操作:

def apply_property(cls):
    def make_getter(name):
        def getter(self):
            return getattr(self, name)
        return getter

    def make_setter(name):
        def setter(self, val):
            setattr(self, name, val)
        return setter

    for f in cls.fields:
        getter = make_getter('_' + f)
        setter = make_setter('_' + f)
        setattr(cls, f, property(getter, setter))
    return cls


@apply_property
class Point:
    fields = ['x', 'y', 'z']

我假设你有一些比你的例子更复杂的东西。 如果不是这样,我认为你可以只使用普通属性,不需要属性。 如果您需要针对不同属性的不同行为,请尝试搜索“Python描述符”。