oop - python metaclasses of classes created by type -
code better words here:
class metaa(type): def __new__(cls, name, bases, attrs): print "metaa" return super(metaa, cls).__new__(cls, name, bases, attrs) class a(object): __metaclass__ = metaa
this print metaa
class metab(metaa): def __new__(cls, name, bases, attrs): print "metab" return super(metab, cls).__new__(cls, name, bases, attrs) b = type('b', (a, ), {'__metaclass__': metab})
this print metaa
again (?!)
i expect:
metab mataa
the question are:
- why i'm getting
metaa
only? how change code get:
metab mataa
the reason type(name, bases, dict)
not right way create class specified metaclass.
interpreter avoids calling type(name, bases, dict)
when in sees __metaclass__
attribute defined , calls mateclass instead of type(name, bases, dict)
do.
here relevant docs section explains it:
when class definition read, if __ metaclass __ defined callable assigned called instead of type(). allows classes or functions written monitor or alter class creation process [...]
if modify code this:
class metaa(type): def __new__(cls, name, bases, attrs): print "metaa" return super(metaa, cls).__new__(cls, name, bases, attrs) class a(object): __metaclass__ = metaa class metab(metaa): def __new__(cls, name, bases, attrs): print "metab" return super(metab, cls).__new__(cls, name, bases, attrs) class b(a): __metaclass__ = metab
... you'll expected output:
metaa metab metaa
(first line printed when creating class a, second , third when creating class b)
update: question assumed dynamic creation of class b
, i'll extend answer.
to construct class b
metacalss dynamically should same thing interpreter does, i.e. construct class metaclass in __metaclass__
instad of type(name, bases, dict)
.
like this:
b = metab('b', (a, ), {'__metaclass__': metab})
Comments
Post a Comment