簡體   English   中英

動態創建類屬性

[英]Dynamically create class attributes

我需要從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中的對象本身。

我認為元類的情況如下:

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

定義類時,本體命名空間將在類主體結束時轉換為類命名空間。 因此,您可以通過以下方式實現此目的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM