2016-02-14 52 views
0

我有,我想设置取决于元类配置什么类,例如元类:使用取决于配置

use_metaclass = True 

class B(object): pass 

class A(object): 
    __metaclass__ = B 

然而,如果配置(use_metaclass)是假的,我不会类似于为A设置的元类。

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

例子是我想做的“完成”,但不会因工作发生了什么上面说:

use_metaclass = True 

class B(object): pass 

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

回答

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)。