我需要从DEFAULTS字典动态创建类属性。
defaults = {
'default_value1':True,
'default_value2':True,
'default_value3':True,
}
class Settings(object):
default_value1 = some_complex_init_function(defaults[default_value1], ...)
default_value2 = some_complex_init_function(defaults[default_value2], ...)
default_value3 = some_complex_init_function(defaults[default_value3], ...)
我也可以通过某事来实现这个目标。像__init__
一样用于创建类,以便从字典中动态创建这些属性并保存大量代码和愚蠢的工作。
你会怎么做?
非常感谢你!
答案 0 :(得分:23)
你可以在没有使用装饰器的元类的情况下完成它。这种方式比较明确IMO:
def apply_defaults(cls):
defaults = {
'default_value1':True,
'default_value2':True,
'default_value3':True,
}
for name, value in defaults.items():
setattr(cls, name, some_complex_init_function(value, ...))
return cls
@apply_defaults
class Settings(object):
pass
在Python 2.6之前,类装饰器不可用。所以你可以写:
class Settings(object):
pass
Settings = apply_defaults(Settings)
在旧版本的python中。
在提供的示例中apply_defaults
是可重用的......好吧,除了默认值在装饰器的主体中是硬编码的:)如果您只有一个案例,您甚至可以简化代码:
defaults = {
'default_value1':True,
'default_value2':True,
'default_value3':True,
}
class Settings(object):
"""Your implementation goes here as usual"""
for name, value in defaults.items():
setattr(Settings, name, some_complex_init_function(value, ...))
这是可能的,因为类(在类型意义上)是Python中的对象本身。
答案 1 :(得分:3)
我认为元类的情况如下:
class SettingsMeta(type):
def __new__(cls, name, bases, dct):
for name, value in defaults.items():
dct[name] = some_complex_init_function(value, ...)
return type.__new__(cls, name, bases, dct)
class Settings(object):
__metaclass__ = SettingsMeta
答案 2 :(得分:0)
定义类时,本体名称空间将在类主体结束时转换为类名称空间。因此,您可以通过以下方式实现此目的:
class Settings(object):
for key, val in defaults.iteritems():
locals()[key] = some_complex_init_function(val, ...)