In order to set metaclass of a class, we use the __metaclass__
attribute. Metaclasses are used at the time the class is defined, so setting it explicitly after the class definition has no effect.
This is what happens when I try to set metaclasses explicitly;
>>> 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'
The best idea I can think of is to re-define whole class and add the __metaclass__
attribute dynamically somehow. Or do you know a better way set metaclass after the class definition?