编程语言
首页 > 编程语言> > python – 动态创建类属性

python – 动态创建类属性

作者:互联网

我需要从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__一样用于类创建,以便从字典中动态创建这些属性并保存大量代码和愚蠢的工作.

你会怎么做?

非常感谢你提前!

解决方法:

你可以在没有使用装饰器的元类的情况下完成它.这种方式有点清楚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中的对象本身.

标签:python,class-attributes
来源: https://codeday.me/bug/20190929/1830199.html