我有一个类,我想根据配置的内容设置元类,例如:
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
答案 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_metaclass
为False
,则会将type
指定为元类。没关系,因为如果没有声明任何内容,type
是默认的元类(并且Python 3中的所有元类都必须来自type
)。