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

注:每周一到周五都会进行相关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,可以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()#Foocall  

6. f()#对象fcall  

 

总结,Python中,类的行为就是这样,__new__、__init__、__call__等方法不是必须写的,会默认调用,如果自己定义了,就是override,可以custom。既然override了,通常也会显式调用进行补偿以达到extend的目的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值