对于您可能真正想要的内容,语言中的一项规定是为 __setattr__
类编写方法。
每当在实例上访问通常不存在的属性时,就会调用此方法:
>>> class Test(object):
... a = 0
... def __getattr__(self, attr):
... return attr
...
>>> t = Test()
>>> t.a
0
>>> t.b
'b'
>>> t.c
'c'
您直接询问的内容也是可能的,但需要一些技巧 - 尽管常识不建议这样做,但在野外生产中被广泛使用。也就是说,对于 Python 中存在的属性,它是一种特殊类型对象的类属性——至少具有__get__
方法的对象。(要了解更多关于 Python 文档的“描述符协议”的信息)。
现在,尝试一次创建多个属性,就像您通过示例粘贴的代码一样,需要将属性名称从被调用函数注入到类名称空间中。它_是可能的_,甚至在 Python中用于生产,而且实现起来也不难。但不漂亮,尽管如此。
因此,避免这种情况的一种可能方法是调用返回一系列“属性”对象——即干净、可读且可维护:
class MultiProperty(object):
def __init__(self, getter, setter, name):
self.getter = getter
self.setter = setter
self.name = name
def __get__(self, instance, owner):
return self.getter(instance, self.name)
def __set__(self, instance, value):
return self.setter(instance, self.name, value)
def multi_property(mgetter, msetter, *args):
props = []
for name in args:
props.append(MultiProperty(mgetter, msetter, name))
return props
class Test(object):
def multi_getter(self, attr_name):
# isf desired, isnert some logic here
return getattr(self, "_" + attr_name)
def multi_setter(self, attr_name, value):
# insert some logic here
return setattr(self, "_" + attr_name, value)
a,b,c = multi_property(multi_getter, multi_setter, *"a b c".split())