21

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], ...)

私はまた、sthを持つことによってこれを達成することができました. クラスの作成と同様__init__に、これらの属性を辞書から動的に作成し、多くのコードと愚かな作業を節約します。

これをどのように行いますか?

事前にどうもありがとうございました!

4

3 に答える 3

30

デコレータを使用して、メタクラスなしでそれを行うことができます。この方法は、もう少し明確な 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は再利用可能です...まあ、デフォルトがデコレーターの本体にハードコードされていることを除いて:) 1つのケースしかない場合は、コードを次のように単純化することもできます:

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 ではクラス (型という意味で) はオブジェクト自体であるため、これが可能です。

于 2010-04-06T10:16:43.987 に答える
4

メタクラスの場合だと思います:

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
于 2010-04-06T08:54:47.120 に答える
2

クラスを定義するとき、ローカル名前空間はクラス本体の最後でクラス名前空間に変換されます。そのため、次の方法でこれを実現できます。

class Settings(object):
    for key, val in defaults.iteritems():
        locals()[key] = some_complex_init_function(val, ...)
于 2010-04-06T11:42:12.780 に答える