python中的__init__ 、__new__、__call__小结
时间:2021-07-19 20:10:38
1.__new__(cls, *args, **kwargs) 创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身
2.__init__(self, *args, **kwargs) 创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回的实例初始化;注意,这里的第一个参数是self即对象本身【注意和new的区别】
3.__call__(self, *args, **kwargs) 如果类实现了这个方法,相当于把这个类型的对象当作函数来使用,相当于 重载了括号运算符
看具体的例子:
class O(object):
def __init__(self, *args, **kwargs):
print "init"
super(O, self).__init__(*args, **kwargs)
def __new__(cls, *args, **kwargs):
print "new", cls
return super(O, cls).__new__(cls, *args, **kwargs)
def __call__(self, *args, **kwargs):
print "call"
oo = O()
print "________"
oo()
打印出来的是:
new
init
________
call
比如:Python Singleton(单例模式)实现,那我们是不是只是重载一些__new__方法就可以了
class Singleton1(object):
""" 重载new方法"""
def __new__(cls, *args, **kwargs):
if not "_instance" in vars(cls):
cls._instance = super(Singleton1, cls).__new__(cls, *args, **kwargs)
return cls._instance
可不可以重载__init__方法呢?明显不可以,因为__init__之前调用了__new__方法,这时候已经生成了一个对象了,没办法实现单例模式
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
PHP实现加减乘除最简单的实例分享
很有创意的鼠标指针风筝
![](https://img.aspxhome.com/file/UploadPic/20079/22/200792292550972s.jpg)
Python连接mysql数据库及简单增删改查操作示例代码
![](https://img.aspxhome.com/file/2023/8/66908_0s.png)
心理模型
![](https://img.aspxhome.com/file/UploadPic/20095/17/2009-05-12_204505-34s.png)
python数据结构之面向对象
![](https://img.aspxhome.com/file/2023/0/94120_0s.png)
python+adb+monkey实现Rom稳定性测试详解
Python装饰器的练习题
jsSmarty Project
关于浮动的前世今生
![](https://img.aspxhome.com/file/UploadPic/20098/19/01-12s.png)
python中迭代器(iterator)用法实例分析
几种修复ACCESS数据库的实用方法
asp中获取当前页面的地址与参数的函数代码
Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器
Python Flask前端自动登录功能实现详解
Bottle框架中的装饰器类和描述符应用详解
设计"以人为本"和"绿色设计"
python中plot实现即时数据动态显示方法
![](https://img.aspxhome.com/file/2023/6/100756_0s.gif)
asp利用aspjpeg给图片生成PNG透明水印
Python matplotlib绘制散点图配置(万能模板案例)
![](https://img.aspxhome.com/file/2023/9/61989_0s.png)
基于Python制作短信发送程序
![](https://img.aspxhome.com/file/2023/4/69644_0s.gif)