详解python中的__init__与__new__方法编程语言
一、__init__和__new__方法执行的顺序?
在面向对象中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行。
二、__new__方法是什么?
首先,我们先来看下下面的代码
class person(object): def __init__(self,name,age): self.age=age self.name=name print(exec init....) def __new__(cls, *args,**kwargs): print(exec new....) return super(person,cls).__new__(cls) obj1=person(wd,22) 执行结果: exec new.... exec init....
上面代码告诉了我们,执行init之前new方法执行了,并且代码中重构了父类的new方法,在上一篇面向对象过程中解释了类创建过程,执行new的过程就是person类创建的过程,所以__new__方法实际上就是创建这个类实例方法。(这里指的是person类)
说明下上述代码的执行过程:
1.当解释器解释到obj1=person( wd ,22)时候,先执行__new__(cls,*args,**kwargs),并执行父类的__new__方法,将name,age参数传入父类__new__方法,创建person。
2.类创建完成以后,在调用__init__方法,将wd和22参数传入创建对象。
三、__init__与__new__的区别
从上述过程中我们可以发现,这两个方法区别在于:
1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
2.__new__ 通常用于控制生成一个类实例的过程。它是类级别的方法。
四、__new__的作用
依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。
首先我们来看一下一个功能,自定义类似int类功能,使用int类整数化以后将数变为非负数(大于0)。
class myint(int): def __new__(cls, *args,**kwargs): print(exec new....) return super(myint,cls).__new__(cls,abs(*args)) print(myint(-1))#自定义int类 print(int(-1))#自带的int类 exec new.... -1
五、通过__new__方法实现单实例
单例模式,可以简单理解为实例化后生成的每个实例都是完全一样的。
class Single(object): def __new__(cls): if not hasattr(cls, myinstance): cls.myinstance = super(Single, cls).__new__(cls) return cls.myinstance#每次生成的都是同一个实例
相关文章
- python中矩阵的转置怎么写_Python 矩阵转置的几种方法小结
- python十进制转换_Python 进制转换
- python进制转换函数-Python中进制转换函数的使用
- python判断linux中文件是否存在_Python判断文件是否存在的三种方法
- Python 技巧篇-pip卸载python库实例演示,查看pip命令大全方法[通俗易懂]
- 【说站】python casefold()方法如何使用
- 【说站】python中删除文档的方法
- 【说站】python创建平衡二叉树的方法
- 【好久不见】细评python绘制双y轴图的几种方法
- python win32api sendmessage_Python win32api.SendMessage方法代码示例[通俗易懂]
- 人生苦短,我用Python-手把手教你如何使用python写串口调试助手
- Python 接口测试requests.post方法中data与json参数区别
- python基础语法学习
- Python获取脚本所在目录的正确方法详解编程语言
- python实现将文本转换成语音的方法详解编程语言
- Python 七种邮件内容发送方法实例详解编程语言
- python scrapy 网络采集使用代理的方法详解编程语言
- python发送各类邮件的主要方法详解编程语言
- python版本升级及pip部署方法详解编程语言
- 小白的Python之路 day5 python模块详解及import本质编程语言
- Python学习:6.python内置函数详解编程语言
- python readline()方法详解编程语言
- python通过http(multipart/form-data)上传文件的方法详解编程语言
- Linux查看Python安装路径的方法(linux查看python安装路径)
- 使用Python连接MySQL数据库,实现高效数据交互(python连接mysql)
- Python字符串的encode与decode研究心得乱码问题解决方法
- Python提示[Errno32]Brokenpipe导致线程crash错误解决方法
- 更改Python命令行交互提示符的方法