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:

  1. why i'm getting metaa only?
  2. 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

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -