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

最新文章

  1. LoadRunner测试结果分析03 转载至zhangzhe的新浪博客
  2. mvc DropDownList默认选项
  3. 【TextBox】重写右键菜单
  4. Hello Netgen
  5. daemon
  6. 开机就提示“请安装TCP/IP协议,error=10106”的解决的方法
  7. Java和.NET下socket转换错误记录
  8. android应用一(调用WebServices)
  9. 配置Struts2的异常处理
  10. 10年程序员谈.Net程序员的职业规划(图/文)
  11. display: inline-block兼容性写法
  12. Windows环境下多线程编程原理与应用读书笔记(4)————线程间通信概述
  13. 【Luogu3444】ORK-Ploughing(贪心)
  14. js浏览器判断函数
  15. Codeforces 1068 - A/B/C/D/E - (Done)
  16. esp8266尝鲜
  17. Android自定义View学习(二)
  18. 使用Hadoop API 压缩HDFS文件
  19. android弹出对话框
  20. thinkphp 5.0手记

热门文章

  1. [数学理论] NP问题解释
  2. 交叉编译esp8089
  3. DLL的两种加载方式
  4. Lamdba表达式的无参数无返回值的练习-Lambda表达式有参数有返回值的练习
  5. 图解B树及C#实现(3)数据的删除
  6. QT 5 中文乱码,试试在PRO文件加入这几行代码
  7. Python3中的“加和”函数
  8. P30_全局配置 - window - 下拉刷新
  9. el-table 在第一行添加合计行和操作按钮
  10. 罗姆BU32107EFV缩写词