[Metaclasses] are deeper magic than 99% of users should ever worry about. If you wonder whether you need them, you don't (the people who actually need them know with certainty that they need them, and don't need an explanation about why).
Tim Peters
Метаклас — клас, чийто инстанции са класове.
Забравете предишнoto твърдение.
Искаме да видим всички класове, които са се регистрирали в нашата система.
Пример: имаме зоологическа градина с цяла йерархия от класове, като позволяваме на програмистите
да дефинират нови класове от животни. Как да видим всички класове животни? Как да видим всичко животни,
които могат да плуват? Как да намерим всички животни наследник на класа Риба
?
getName
срещу get_name
Внимавайте да не сте много строги.
__metaclass__
type
или types.ClassType
(стар стил)type
и за нас не остава кой знае колко за добавим__new__
, __init__
__metaclass__ = type
class JustInit(type):
baba = 6
def a__call__(cls, *args):
newo = cls.__new__(cls, cls.__name__, cls.__bases__, cls.__dict__)
if hasattr(newo, 'init') and callable(getattr(newo, 'init')):
newo.init(*args)
return newo
def __new__(cls, clsname, bases, d):
return 5
def __init__(self, *args):
self.__init__ = self.init
self.__call__ = lambda x: 77
class X(object):
__metaclass__ = JustInit
def __init__(self): print "__init__"
def init(self):
self.x = 18
# X = X.__metaclass__('X', (object,), {...})
# f = obj(3)
# type.__call__(cls, *args):
# newo = cls.__new__()
# cls.__init__(newo, *args)
# return newo
print type(X)
x = X()
print x()
print type(x)
#print x.baba
#print X.baba