注:每周一到周五都会进行相关Python基础知识更新,欢迎大家提宝贵的意见
@staticmethod # known case of __new__ def __new__(cls, *more): # known special case of object.__new__ """ T.__new__(S, ...) -> a new object with type S, a subtype of T """ passdef __new__(cls, *more)方法: 静态方法,负责对象的创建,只要创建对象那么就要需要申请内存。此时还没有self等参数
def __init__(self, *args, **kwargs): # real signature unknown pass
def __init__(self, *args, **kwargs)方法: 负责对象成员的初始化, 属于实例方法,第一个参数是self。
def __call__(self, *more): # real signature unknown; restored from __doc__ """ x.__call__(...) <==> x(...) """ pass
def __call__(self, *more)方法: 声明该类的对象是可以进行call的。注意是对象非类!!!
先创建,再初始化。先__new__,再__init__。
eg:
对于__new__
[python] view plain copy
1. class Myobjcet(object):
2. pass
3.
4. class Test(object):
5. def __new__(cls, *more):
6. return Myobjcet()
7.
8. print Test()
可以看到,输出来是一个对象。
__new__方法在类中可以省略,如果没有定义,在创建对象的时候默认会调用父类中的__new__如果没有则会一直向上查找。如果定义了那么就执行__new__方法,因为是override,可以custom创建对象的行为
既然__new__可以custom对象的创建,那在这里做一下手脚,每次创建对象都返回同一个,就可以成为单例模式了,可以关注下期《单例模式》
在定义单例模式时,因为重载了父类的__new__,所以要自己显式调用父类的__new__,即Myobject.__new__(cls,*args, **kwargs),或者用super()。,不然就不是extend原来的实例了,而是替换原来的实例。
对于__call__
[python] view plain copy
1. class Foo(object):
2. def __call__(self):
3. pass
4.
5. f = Foo()#类Foo可call
6. f()#对象f可call
总结,在Python中,类的行为就是这样,__new__、__init__、__call__等方法不是必须写的,会默认调用,如果自己定义了,就是override,可以custom。既然override了,通常也会显式调用进行补偿以达到extend的目的。