以编程方式为声明性定义的类创建类属性

时间:2018-05-21 19:51:17

标签: python python-3.x

这是针对python 3(最新版)。我知道我能做到:

class Foo:
    id = some_method_defining_id()

或者

class Foo:
     (id, uuid) = some_method_defining_id_and_uuid()

我想有一个方法可以返回多个名字我不知道的类属性:

class Foo:
    **some_method_defining_multiple_unknown_attributes() # returns a dict

我知道我可以使用type以编程方式定义Foo。我也知道我可以在类定义后添加属性。

1 个答案:

答案 0 :(得分:0)

警告:请勿在工作中尝试 at home 。这太丑了。

我会给你三种方法。

一个类装饰器

def get_me_some_attributes():
    return {'a': 1, 'b': 2}

def add_attributes_to_class(attributes):
    def decorate_class(cls):
        for name, value in attributes.items():
            setattr(cls, name, value)
    return cls
return decorate_class


@add_attributes_to_class(get_me_some_attributes())
class A:
    pass

测试它:

>>> A.a
1
>>> A.b
2

直接调用元类构造函数

>>> B = type('B', (object,), get_me_some_attributes())
>>> B
<class '__main__.B'>
>>> B.a
1
>>> B.b
2
>>>

自定义元类

class MySpecialMeta(type):
    def __new__(cls, name, bases, namespace):
        SPECIAL_STUFF = namespace.pop('SPECIAL_STUFF', {})
        namespace.update(SPECIAL_STUFF)
        return super().__new__(cls, name, bases, namespace)

class C(metaclass=MySpecialMeta):
    SPECIAL_STUFF = get_me_some_attributes()

测试它:

>>> C
<class '__main__.C'>
>>> C.a
1
>>> C.b
2