new:对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self) init:对象的初始化,是一个实例方法,第一个参数是self。 call:对象可call,注意不是类,是对象。 先有创建,才有初始化。即先new,而后init。 上面说的不好理解,看例子。 1。对于newclassBar(object):passclassFoo(object):defnew(cls,args,kwargs):returnBar()printFoo() 可以看到,输出来是一个Bar对象。 new方法在类定义中不是必须写的,如果没定义,默认会调用object。new去创建一个对象。如果定义了,就是override,可以custom创建对象的行为。 聪明的读者可能想到,既然new可以custom对象的创建,那我在这里做一下手脚,每次创建对象都返回同一个,那不就是单例模式了吗?没错,就是这样。可以观摩《飘逸的python单例模式乱弹》 定义单例模式时,因为自定义的new重载了父类的new,所以要自己显式调用父类的new,即object。new(cls,args,kwargs),或者用super()。,不然就不是extend原来的实例了,而是替换原来的实例。 2。对于init 使用Python写过面向对象的代码的同学,可能对init方法已经非常熟悉了,init方法通常用在初始化一个类实例的时候。例如:coding:utf8classPerson(object):SillyPersondefinit(self,name,age):self。namenameself。ageagedefstr(self):returnPerson:s(s)(self。name,self。age)ifnamemain:pigleiPerson(piglei,24)printpiglei 这样便是init最普通的用法了。但init其实不是实例化一个类的时候第一个被调用的方法。当使用Persion(name,age)这样的表达式来实例化一个类时,最先被调用的方法其实是new方法。 3。对于call 对象通过提供call(slef,〔,args〔,kwargs〕〕)方法可以模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1,arg2。。。)等同于调用x。call(self,arg1,arg2)。模拟函数的对象可以用于创建防函数(functor)或代理(proxy)。classFoo(object):defcall(self):print(call)fFoo()类Foo可callf()对象f可call输出结果call 总结,在Python中,类的行为就是这样,new、init、call等方法不是必须写的,会默认调用,如果自己定义了,就是override,可以custom。既然override了,通常也会显式调用进行补偿以达到extend的目的。 这也是为什么会出现明明定义definit(self,args,kwargs),对象怎么不进行初始化这种看起来诡异的行为。(注,这里init少写了个下划线,因为init不是必须写的,所以这里不会报错,而是当做一个新的方法init)