python实例化对象过程
Python中存在着一种静态的__new__()方法,通常在定义类时不会重写__new__()方法,于是Python在调用类时会自动寻找该类的继承对象(本例中为Object),然后返回当前类的实例对象:
def __new__(cls, *args, **kwargs): ... return object.__new__(cls) #执行object的__new__()函数
执行object的__new__()函数后会返回实例对象(self),然后将self作为第一个参数传给该类的初始化方法__init__()方法。这里self只是实例对象的一个名字,也是Python里约定俗成的一种叫法,可以自定义其名称。
当运行c1 = Myclass(11)代码时其实做了两个动作:
class Myclass(object): def __init__(self, x): self.x = x c1 = Myclass(11) #相当于隐式执行了__new__()和__init() c2 = Myclass.__new__(Myclass, 12) #显式调用__new__(),返回c2对象 c2.__init__( 12) #显示调用__init(),完成c2的初始化 print c1.x, c2.x
输出: 11 12
__new__和__metaclass__
在python中,一切皆对象,我们定义的类其实。。。也是一个对象,那么,类本身是谁的对象呢?在python2.2之前(或者叫经典类中),所有的类,都是class的对象,但是在新式类中,为了将类型(int,str,float等)和类统一,所以,所有的类都是type类型的对象。当然,这个规则可以被修改,在类中有一个属性 __metaclass__ 可以指定当前类该由哪个类进行实例化。而创建对象过程中,其实构造器不是__init__方法,而是__new__方法,这个方法会返回一个对象,这才是对象的构造器。
下面是一个解释类实例化对象内部实现过程的代码段:
class Mytype(type): def __init__(self, what, bases=None, dict=None): super(Mytype,self).__init__(what, bases, dict) def __call__(self, *args, **kwargs): obj=self.__new__(self) self.__init__(obj, *args, **kwargs) return obj class Foo: __metaclass__=Mytype def __init__(self,name,age): self.name=name self.age=age def __new__(cls, *args, **kwargs): return object.__new__(cls) obj=Foo("xiaoming",18) print(obj.name,obj.age)
执行结果:xiaoming 18