Python中的__new__()方法
2024-10-20 07:38:29
1、__new__()至少要有一个参数cls,代表当前类,此参数在实例时由python解释器自动识别, 2、__new__()必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,
可以 return父类new出来的实例,
如:return super().__new__(cls),或者直接return object.__new__(cls) 3、init有一个参数self,就是这个__new__()方法返回的实例,
可以完成一些其它初始化的动作,init不需要返回值(有返回值就会报错) 4、如果__new__()创建的是当前类的实例,会自动调用__init__()函数,
通过return语句里面调用的__new__(cls)函数的第一个参数是cls来保证是当前类实例,
如果是其他类的类名,那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__()函数,也不会调用其他类的__init__()函数。
如下示例:
class A(object):
def __init__(self):
print('这是init方法:',self) def __new__(cls, *args, **kwargs):
print('这是cls类本身的ID:',id(cls))
print('这是new方法:',object.__new__(cls))
# print('这是new方法:',super().__new__(cls)) # 跟上面那句本质一样,都是调用父类的new方法
return object.__new__(cls) A()
print('这是A类的ID:',id(A)) '''
输出结果如下:
这是cls类本身的ID: 2790056212288
这是new方法: <__main__.A object at 0x000002899CB281C0>
这是init方法: <__main__.A object at 0x000002899CB281C0>
这是A类的ID: 2790056212288
'''
示例具体图解如下:
通过new方法实现单例:
'''
__new__实现 ---> 通过调用类方法实例化对象时,自动触发的__new__来实现单例
''' class Aoo(object):
_instance = None def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = object.__new__(cls) return cls._instance a1 = Aoo()
a2 = Aoo()
# print(a1 is a2) # True
最新文章
- LoadRunner测试结果分析03 转载至zhangzhe的新浪博客
- mvc DropDownList默认选项
- 【TextBox】重写右键菜单
- Hello Netgen
- daemon
- 开机就提示“请安装TCP/IP协议,error=10106”的解决的方法
- Java和.NET下socket转换错误记录
- android应用一(调用WebServices)
- 配置Struts2的异常处理
- 10年程序员谈.Net程序员的职业规划(图/文)
- display: inline-block兼容性写法
- Windows环境下多线程编程原理与应用读书笔记(4)————线程间通信概述
- 【Luogu3444】ORK-Ploughing(贪心)
- js浏览器判断函数
- Codeforces 1068 - A/B/C/D/E - (Done)
- esp8266尝鲜
- Android自定义View学习(二)
- 使用Hadoop API 压缩HDFS文件
- android弹出对话框
- thinkphp 5.0手记