# -*- coding: iso-8859-1 -*- # ############################################################################## class MA( type ): @staticmethod def __new__( metacls, name, superclasses, dct ): print "MA: Allocating memory for class %s using metaclass %s, %s, %s" % ( name, str( metacls ), str( superclasses ), str( dct )) print "MA: super( MA, cls ).__new__( %s, %s, %s, %s )" % ( metacls, name, str( superclasses ), str( dct )) print "MA: -------> why does super( MA, metacls ).__new__ call MC.__new__ in next line ????????????????????" rettype = super( MA, metacls ).__new__( metacls, name, superclasses, dct ) print "MA: return value is %s" % ( rettype ) return rettype def __init__( cls, name, superclasses, dct ): print "MA: Initialising (configuring) class %s using class %s - bases: %s, dct %s" % ( name, str( cls ), str( superclasses ), str( dct )) super( MA, cls ).__init__( name, superclasses, dct ) class MB( MA ): @staticmethod def __new__( metacls, name, superclasses, dct ): print "MB: Allocating memory for class %s using metaclass %s, %s, %s" % ( name, str( metacls ), str( superclasses ), str( dct )) print "MB: super( MB, cls ).__new__( %s, %s, %s, %s )" % ( metacls, name, str( superclasses ), str( dct )) rettype = super( MB, metacls ).__new__( metacls, name, superclasses, dct ) print "MB: return value is %s" % ( rettype ) return rettype return rettype def __init__( cls, name, superclasses, dct ): print "MB: Initialising (configuring) class %s using class %s - bases: %s, dct %s" % ( name, str( cls ), str( superclasses ), str( dct )) super( MB, cls ).__init__( name, superclasses, dct ) class MC( MB ): @staticmethod def __new__( metacls, name, superclasses, dct ): print "MC: Allocating memory for class %s using metaclass %s, %s, %s" % ( name, str( metacls ), str( superclasses ), str( dct )) print "MC: super( MC, cls ).__new__( %s, %s, %s, %s )" % ( metacls, name, str( superclasses ), str( dct )) rettype = super( MC, metacls ).__new__( metacls, name, superclasses, dct ) print "MC: return value is %s" % ( rettype ) return rettype return rettype def __init__( cls, name, superclasses, dct ): print "MC: Initialising (configuring) class %s using class %s - bases: %s, dct %s" % ( name, str( cls ), str( superclasses ), str( dct )) super( MC, cls ).__init__( name, superclasses, dct ) class A( object ): __metaclass__ = MC pass print "\n==============================================================================\n" class B( A ): __metaclass__ = MB pass b = B() >> Trace output --------------------------------------------------------------------------- >> Trace output --------------------------------------------------------------------------- ---------- run ---------- Starting up PASSPorts ... MC: Allocating memory for class A using metaclass , (,), {'__module__': '__main__', '__metaclass__': } MC: super( MC, cls ).__new__( , A, (,), {'__module__': '__main__', '__metaclass__': } ) MB: Allocating memory for class A using metaclass , (,), {'__module__': '__main__', '__metaclass__': } MB: super( MB, cls ).__new__( , A, (,), {'__module__': '__main__', '__metaclass__': } ) MA: Allocating memory for class A using metaclass , (,), {'__module__': '__main__', '__metaclass__': } MA: super( MA, cls ).__new__( , A, (,), {'__module__': '__main__', '__metaclass__': } ) >> MA: return value is MB: return value is MC: return value is MC: Initialising (configuring) class A using class - bases: (,), dct {'__module__': '__main__', '__metaclass__': } MB: Initialising (configuring) class A using class - bases: (,), dct {'__module__': '__main__', '__metaclass__': } MA: Initialising (configuring) class A using class - bases: (,), dct {'__module__': '__main__', '__metaclass__': } ============================================================================== MB: Allocating memory for class B using metaclass , (,), {'__module__': '__main__', '__metaclass__': } MB: super( MB, cls ).__new__( , B, (,), {'__module__': '__main__', '__metaclass__': } ) MA: Allocating memory for class B using metaclass , (,), {'__module__': '__main__', '__metaclass__': } MA: super( MA, cls ).__new__( , B, (,), {'__module__': '__main__', '__metaclass__': } ) MA: -------> why does super( MA, metacls ).__new__ call MC.__new__ in next line ???????????????????? MC: Allocating memory for class B using metaclass , (,), {'__module__': '__main__', '__metaclass__': } MC: super( MC, cls ).__new__( , B, (,), {'__module__': '__main__', '__metaclass__': } ) MB: Allocating memory for class B using metaclass , (,), {'__module__': '__main__', '__metaclass__': } MB: super( MB, cls ).__new__( , B, (,), {'__module__': '__main__', '__metaclass__': } ) MA: Allocating memory for class B using metaclass , (,), {'__module__': '__main__', '__metaclass__': } MA: super( MA, cls ).__new__( , B, (,), {'__module__': '__main__', '__metaclass__': } ) >> MA: return value is MB: return value is MC: return value is MA: return value is MB: return value is MC: Initialising (configuring) class B using class - bases: (,), dct {'__module__': '__main__', '__metaclass__': } MB: Initialising (configuring) class B using class - bases: (,), dct {'__module__': '__main__', '__metaclass__': } MA: Initialising (configuring) class B using class - bases: (,), dct {'__module__': '__main__', '__metaclass__': } ... PASSPorts shutdown complete Output completed (0 sec consumed) - Normal Termination