Python语言学习讲解十八: __new__、__init__、__call__之详解
2017-01-04 17:40
746 查看
注:每周一到周五都会进行相关Python基础知识更新,欢迎大家提宝贵的意见
由于近期忙着手游发布,所以这几天没有及时更新望各位学者见谅。年底了,各大公司特别是游戏行业都着手赶年底末班车,给用户一个新年的礼物。本期写点比较基础的,类似于C++的new 构造函数等。
def __new__(cls, *more)方法: 静态方法,负责对象的创建,只要创建对象那么就要需要申请内存。此时还没有self等参数
def __init__(self, *args, **kwargs)方法: 负责对象成员的初始化, 属于实例方法,第一个参数是self。
def __call__(self, *more)方法: 声明该类的对象是可以进行call的。注意是对象非类!!!
先创建,再初始化。先__new__,再__init__。
eg:
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原来的实例了,而是替换原来的实例。
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的目的。
由于近期忙着手游发布,所以这几天没有及时更新望各位学者见谅。年底了,各大公司特别是游戏行业都着手赶年底末班车,给用户一个新年的礼物。本期写点比较基础的,类似于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] viewplain 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] viewplain 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的目的。
相关文章推荐
- python __new__ __init__ __call__详解
- Python语言学习讲解五:列表(List)操作方法详解
- 详解Python中的__new__、__init__、__call__三个特殊方法
- Python语言学习讲解三:详解Python中的split()函数的使用方法
- 详解Python中的__new__、__init__、__call__三个特殊方法(zz)
- 详解Python中的__new__、__init__、__call__三个特殊方法
- Python语言学习讲解十七:python之__gettattr__、__getattribute__和__setattr__详解
- 详解Python中的__new__、__init__、__call__三个特殊方法
- 飘逸的python - __new__、__init__、__call__傻傻分不清
- Python中__new__与__init__方法的区别详解
- Python语言学习讲解一:【赋值、浅拷贝与深拷贝】
- python中的__init__ 、__new__、__call__小结
- 详解Python中的__init__和__new__
- python中的__init__ 、__new__、__call__小结
- python中的__init__ 、__new__、__call__小结
- Python语言学习讲解二:@staticmethod和@classmethod的作用与区别
- python类中的__call__、__init__、__getattr__、__setattr__、__setattr__详解
- python中的__init__ 、__new__、__call__小结及使用
- Python中__init__和__new__的区别详解
- python __init__ __new__ __call__