Python中的__new__()方法
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
Python中的__new__()方法的更多相关文章
- Python中的__new__()方法与实例化
@Python中的__new__()方法与实例化 __new__()是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在Python 中 存在于类里面的构造方法__init__ ...
- Python中的__new__()方法的使用
__new__() 函数只能用于从object继承的新式类. 先看下object类中对__new__()方法的定义: class object: @staticmethod # known cas ...
- 通俗的讲解Python中的__new__()方法
2020-3-17更新本文,对本文中存争议的例子进行了更新! 曾经我幼稚的以为认识了python的__init__()方法就相当于认识了类构造器,结果,__new__()方法突然出现在我眼前,让我突然 ...
- 关于python中的__new__方法
在上篇中,简单的比较了下new方法和init方法,然后结合网上的东西看了一点,发现..看书有的时候说的并不全面. __new__方法是一个类方法,主要作用是来指导如何生成类的实例, 主要用于,当需要生 ...
- python 中的__new__方法
1.有关__new__方法的介绍 __new__方法调用在构造方法构造实例之前,即在__init__方法执行之前,我们可以这样理解,他的作用是决定是否适用这个__iint__方法来构造实例,但是需要注 ...
- Python3中的__new__方法以及继承不可变类型类的问题
最近在学到Python中的__new__方法时被弄懵逼了,一开始实在是很难理解,有很多地方想不通(本人强迫症).最近自己慢慢思索得出了能说服自己的理解: 说__new__方法之前要先提到__init_ ...
- 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑
上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...
- Python中的__new__和__init__
Python中的__new__和__init__ 写了这么多的class,现在才知道还有个__new__方法, 那么它和__init__有什么区别呢? class TestCls(): "& ...
- 一个案例深入Python中的__new__和__init__
准备 在Python中,一切皆对象. 既然一切皆对象,那么类也是对象,我们暂且称之为 类对象.来个简单例子(本篇文章的所有案例都是运行在Python3.4中): class foo(): pass p ...
- python中的replace()方法的使用
python中的replace()方法的使用 需求是这样的:需要将字符串的某些字符替换成其他字符 str.replace(old,new,max) 第一个参数是要进行更换的旧字符,第二个参数是新的子串 ...
随机推荐
- 使用idea进行gitee代码管理
目录 1.在idea插件市场安装gitee插件 2.把本地仓库的release分支上的代码合到dev分支上 3.把本地dev分支上的代码合到远程dev分支上去 1.在idea插件市场安装gitee插件 ...
- Vue + Element 自定义上传封面组件
前一段时间做项目,频繁使用到上传图片组件,而且只上传一个封面,于是想着自定义一个图片封面上传组件.先来看一下效果: 第一张图片是上传之前,第二张图片是上传 ...
- [深度学习]Keras利用VGG进行迁移学习模板
# -*- coding: UTF-8 -*- import keras from keras import Model from keras.applications import VGG16 fr ...
- 1.【窗口组件】小部件-QWidgt
一.前言 QWidget翻译过来是小部件的意思,QWidgt 类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗 口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部 ...
- 【Dubbo3终极特性】「流量治理体系」一文教你如何通过Dubbo-Admin实现动态进行流量隔离机制
背景信息 如果一个应用有多个版本在线上同时运行,部署在不同环境中,如日常环境和特殊环境,则 可以使用标签路由对不同环境中的不同版本进行流量隔离,将秒杀订单流量或不同渠道订单流量路由到特殊环境,将正常的 ...
- C Primer Plus(4.8)編程練習
/*C Primer Plus (4.7) 5*/ 1 include<stdio.h> 2 #define BOOK "War and Peace" 3 int ma ...
- Translent关键字-InvalidClassException异常_原理和解决方案
Translent关键字 static关键字:静态关键字静态优先于非静态加载到内存中(静态优先于对象进入到内存中)被static修饰的成员变量不能被序列化的,序列化的都是对象private stati ...
- Add All&shuffle-sort(List)
Add All&shuffle Collections常用功能 java.utils.collections是集合工具类,用来对集合进行操作.部分方法如下︰ public static < ...
- Java + SikuliX 基于图像实现自动化测试
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/6d2908e8.html 你好,我是测试蔡坨坨. 由于目前大多数GUI工具均需要依赖于程序类型进行特征属性识别,例如:Sel ...
- C#/VB.NET 如何在不同工作簿之间复制单元格范围
在处理 Excel 文档时,我们经常需要将数据整合到一个工作表以便于我们进行管理或数据对比.为了提高工作效率,我们可以在不同的工作簿之间复制选定的单元格区域或整个工作表.本文将演示如何通过编程方式将选 ...