在我的对象的init中,我想从iterable中创建对象属性。例如:
class MyClass(object):
def __init__(self, parameters):
attributes = ['name',
'memory',
'regressors',
'use_const']
for attr_name in attributes():
try:
attr_val = parameters[attr_name]
except KeyError:
raise Error("parameters must contain {}".format(attr_name))
setattr(self, attr_name, attr_val)
这让我可以获得我想要的属性。但是,与定义
相比,我失去了什么@property
def name(self):
"""str: This class' name"""
return self._name
是我现在没有得到属性的文档字符串。
我想拥有每个属性的文档字符串(对于我自动生成的文档),但我也想使用iterable而不必分别定义每个属性。例如,我可以将attributes
转换为带有docstring作为值的dict,并动态设置属性的docstring吗?
我可以吃蛋糕吗?
答案 0 :(得分:1)
您只能在类上设置property
个对象。您可以在循环中执行此操作,但必须在构建类时执行此操作,而不是实例。
只需生成property
个对象:
def set_property(cls, name, attr, docstring):
def getter(self):
return getattr(self, attr)
prop = property(getter, None, None, docstring)
setattr(cls, name, prop)
for name in attributes:
attr = '_' + name
docstring = "str: This class' {}".format(name)
set_property(SomeClass, name, attr, docstring)