详解Python中的__new__、__init__、__call__三个特殊方法
__new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self) 先有创建,才有初始化。即先__new__,而后__init__。 1.对于__new__ class Bar(object): pass class Foo(object): def __new__(cls,*args,**kwargs): return Bar() print Foo() 可以看到,输出来是一个Bar对象。 __new__方法在类定义中不是必须写的,如果没定义,默认会调用object.__new__去创建一个对象。如果定义了,就是override,可以custom创建对象的行为。 2.对于__init__ 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候。例如: # -*- coding: utf-8 -*- class Person(object): """Silly Person""" def __init__(self,name,age): self.name = name self.age = age def __str__(self): return '<Person: %s(%s)>' % (self.name,self.age) if __name__ == '__main__': piglei = Person('piglei',24) print piglei 这样便是__init__最普通的用法了。但__init__其实不是实例化一个类的时候第一个被调用 的方法。当使用 Persion(name,age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 __new__ 方法。 3.对于__call__ class Foo(object): def __call__(self): pass f = Foo()#类Foo可call f()#对象f可call 总结,在Python中,类的行为就是这样,__new__、__init__、__call__等方法不是必须写的,会默认调用,如果自己定义了,就是override,可以custom。既然override了,通常也会显式调用进行补偿以达到extend的目的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |