我正在尝试创建一个函数,它从类实例中获取可变数量的属性,并像使用@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)
截至目前,当我调用该函数时,它什么也没做。对我做错了什么想法?
答案 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描述符”。