根据配置使用元类

时间:2016-02-14 07:33:52

标签: python

我有一个类,我想根据配置的内容设置元类,例如:

use_metaclass = True

class B(object):  pass

class A(object):
    __metaclass__ = B

但是,如果配置(use_metaclass)为False,我不希望为A设置元类。

我该如何实现?我意识到一个类是一个元类的实例,所以我想这必须以某种方式在A的定义中设置,而不是在实例化A之后。

示例我想要“完成”但由于上述内容而无法工作:

use_metaclass = True

class B(object):  pass

class A(object):
    def __init__(self):
        if use_metaclass:
            self.__metaclass__ = B

1 个答案:

答案 0 :(得分:1)

如果需要,可以在类体中放置条件逻辑:

class A(object):
    if use_metaclass:
        __metaclass__ = B

这会在类定义时进行评估,因此您需要确保在加载类之前将use_metaclass设置为所需的值(稍后您无法更改元类)。

在Python 3中,元类的声明方式不同,您需要在if行中使用else / class三元运算符:

class A(metaclass=B if use_metaclass else type):
    pass

如果use_metaclassFalse,则会将type指定为元类。没关系,因为如果没有声明任何内容,type是默认的元类(并且Python 3中的所有元类都必须来自type)。