from new import classobj def connectClasses( newClassName, parentClass, childClass ): # Create an empty shell class with the passed in parentClass # as the parent. DupedChildClass = classobj( newClassName, (parentClass,), {} ) # Inject the parent class in to the child as a member, in case # the child wants to call the parent. DupedChildClass._parentClass = parentClass # Copy references to all the members of the child class passed in # to the new version of the child class connected to the # given parent class. i.e. fill in the dupedChildClass shell created # on previous line. for k,v in childClass.__dict__.items(): # U can't overwrite the doc string for some reason if k != '__doc__': setattr( DupedChildClass, k, v ) return DupedChildClass class Person: def sayHello( self ): print "Hi, I am a %s." % self._getMyGender() class Man( Person ): def _getMyGender( self ): return "man" class Woman( Person ): def _getMyGender( self ): return "woman" class Insecure: def _getMyGender( self ): return self._parentClass._getMyGender( self ) + ', if that is OK' # Create the two new classes InsecureMan = connectClasses( 'InsecureMan', Man, Insecure ) InsecureWoman = connectClasses( 'InsecureWoman', Woman, Insecure ) # Instantiate classes iMan = InsecureMan() iWoman = InsecureWoman() man = Man() woman = Woman() # Test the classes man.sayHello() woman.sayHello() iMan.sayHello() iWoman.sayHello() # Expected output ''' Hi, I am a man. Hi, I am a woman. Hi, I am a man, if that is OK. Hi, I am a woman, if that is OK. '''