Python 动态创建类属性

Python 动态创建类属性,python,class-attributes,Python,Class Attributes,我需要从默认字典动态创建类属性 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_

我需要从默认字典动态创建类属性

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], ...)
我也可以通过使用
\uuu init\uuu
之类的工具来创建类,以便从字典中动态创建这些属性,从而节省大量代码和愚蠢的工作

你会怎么做


提前非常感谢

我认为元类就是这样:

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

您可以不用使用装饰器的元类来完成它。这一点在国际海事组织更为明确:

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\u默认值
是可重用的……好吧,除了默认值是在装饰器主体中硬编码的:)如果您只有一个案例,您甚至可以将代码简化为:

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中的对象。

在定义类时,本地名称空间将在类主体结束时转换为类名称空间。因此,您可以通过以下方式完成此任务:

class Settings(object):
    for key, val in defaults.iteritems():
        locals()[key] = some_complex_init_function(val, ...)

-1 for
locals()
表示不应修改返回的词典的内容。您还需要在decorator函数的末尾返回“修饰”类(
cls
),不是吗?我花了一段时间才弄明白,但除非我这样做,否则定义后的类将等于
None
。我是否遗漏了一些内容,例如通过引用提供类的某种方式?我如何将默认值传递给文件,如
a=Settings(defaults)
Settings.py
是一个特定的文件我们如何传递默认值,或者,我们如何初始化此设置类的任何对象?使用@vijayshanker同一问题代码取决于定义
设置
类时
默认值
字典在范围内。setting.py文件中的
设置数据
设置
?如何将defaults参数传递给它?对于当前代码,您不能传递任何内容,
defaults
字典取自
Settings
类之前定义的范围。为了能够通过默认设置,您需要对其进行重组。但这感觉和最初提出的问题不同。