代码之家  ›  专栏  ›  技术社区  ›  Pat

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

  •  2
  • Pat  · 技术社区  · 6 年前

    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

    1 回复  |  直到 6 年前
        1
  •  0
  •   zvone    6 年前

    警告: 别试这个 在家里 在工作中。很难看。

    我给你三种方法。

    班级装饰员

    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