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

Rob*_*bie 5 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
Run Code Online (Sandbox Code Playgroud)

通过这样做:

decorate_these_attributes(self.x, self.dx, self.dy)
Run Code Online (Sandbox Code Playgroud)

到目前为止我所拥有的:

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)
Run Code Online (Sandbox Code Playgroud)

到目前为止,当我调用该函数时,它没有执行任何操作。对我做错了什么有什么想法吗?

sat*_*oru 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']
Run Code Online (Sandbox Code Playgroud)

我假设您想到的事情比您的示例更复杂。如果不是这种情况,我认为您可以只使用普通属性,不需要属性。如果您需要不同属性的不同行为,请尝试搜索“Python 描述符”。