クラスのメタクラスを設定するには、__metaclass__
属性を使用します。メタクラスはクラスの定義時に使用されるため、クラス定義の後に明示的に設定しても効果はありません。
これは、メタクラスを明示的に設定しようとすると起こることです。
>>> class MetaClass(type):
def __new__(cls, name, bases, dct):
dct["test_var"]=True
return type.__new__(cls, name, bases, dct)
def __init__(cls, name, bases, dct):
super(MetaClass, cls).__init__(name, bases, dct)
>>> class A:
__metaclass__=MetaClass
>>> A.test_var
True
>>> class B:
pass
>>> B.__metaclass__=MetaClass
>>> B.test_var
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
B.test_var
AttributeError: class B has no attribute 'test_var'
私が考えることができる最良のアイデアは、クラス全体を再定義し、__metaclass__
何らかの方法で属性を動的に追加することです。または、クラス定義の後にメタクラスを設定するより良い方法を知っていますか?