A newbie metaclass question

Steven Bethard steven.bethard at gmail.com
Sun May 22 14:10:15 EDT 2005


could ildg wrote:
> When I try to learn metaclass of python by article at this place:
> http://www.python.org/2.2/descrintro.html#metaclasses,
> I changed the autosuper example a little as below:
> <code>
> class autosuper(type):
>     def __init__(cls,name,bases,dict):
>         super(autosuper,cls).__init__(name,bases,dict)
>         setattr(cls,"_%s__super" % name, super(cls))
>         print "in metaclass: ", super(cls)
>         
> class A:
>     __metaclass__ = autosuper
>     def meth(self):
>         print "in class A: ", self.__super
>                 
> a=A()
> a.meth() 
> </code>
> The result is as below:
> in metaclass:  <super: <class 'A'>, NULL>
> in class A:  <super: <class 'A'>, <A object>>

The reason for this is that the super object is a descriptor.  This 
means that
     self.__super
actually calls something like:
     type(self).__super.__get__(self)
So the difference in the two is that the "in metaclass" print references 
the unbound super object, and the "in class A" print references the 
bound super object.

A very simple demonstration of this:

py> class C(object):
...     pass
...
py> C.sup = super(C)
py> C.sup
<super: <class 'C'>, NULL>
py> C().sup
<super: <class 'C'>, <C object>>
py> C.sup.__get__(C())
<super: <class 'C'>, <C object>>

Note that we get the "NULL" output when we ask the *class* for the "sup" 
object.  We get the "C object" output when we ask an *instance* for the 
"sup" object.  The example using __get__ is basically just the explicit 
version of the one that doesn't use __get__.

HTH,

STeVe



More information about the Python-list mailing list