Wednesday, April 17, 2013

__new__ in python

"""
<class '__main__.cchild'> False
True
<class '__main__.cchild'> True
a_base_attr a_child_attr
"""
class cbase(object):
    def __new__(cls):
        #cls is a class, not instance
        print cls,isinstance(cls,cbase)
        #create an instance of sup, and bound cls to it         
        sup=super(cbase, cls)       
        print isinstance(sup,super)
        #now sup know how to create instance of cbase       
        inst_of_cbase = sup.__new__(cls)
        print type(inst_of_cbase),isinstance(inst_of_cbase,cbase)
        #
        return inst_of_cbase
    def __init__(self,base_attr):
        self.base_attr=base_attr

class cchild(cbase):
    def __new__(cls,base_attr,child_attr):
        #before new inst of cchild, new inst of  all of its ancestors   
        return super(cchild, cls).__new__(cchild)
       
    def __init__(self,base_attr,child_attr):
        #explicitly call ancestors's __init__
        cbase.__init__(self,base_attr)
        self.child_attr=child_attr
       
aChild=cchild("a_base_attr","a_child_attr")
print aChild.base_attr,aChild.child_attr

No comments:

Post a Comment