您的位置:首页 > 编程语言 > Python开发

Python语言学习讲解十八: __new__、__init__、__call__之详解

2017-01-04 17:40 746 查看
注:每周一到周五都会进行相关Python基础知识更新,欢迎大家提宝贵的意见

由于近期忙着手游发布,所以这几天没有及时更新望各位学者见谅。年底了,各大公司特别是游戏行业都着手赶年底末班车,给用户一个新年的礼物。本期写点比较基础的,类似于C++的new 构造函数等。

@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 """
pass

def __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,可以[b]custom创建对象的行为[/b]
既然__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的目的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息