python函数的目的与意义_Python函数__new__及__init__作用及区别解析
【同】
二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多。
【异】
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。
也就是:__new__先被调用,__init__后被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
===》》》
【一些说明】
1、继承自object的新式类才有__new__
2、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
3、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例
4、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
5、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是 cls 来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。
6、在定义子类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。
7、而如果子类中重写了__new__()方法,那么你可以自由选择任意一个的其他的新式类(必定要是新式类,只有新式类必定都有__new__(),因为所有新式类都是object的后代,而经典类则没有__new__()方法)的__new__()方法来制造实例,包括这个新式类的所有前代类和后代类,只要它们不会造成递归死循环。反正肯定不能调用自己的__new__,这肯定是死循环。
8、对于子类的__init__,其调用规则跟__new__是一致的,当然如果子类和父类的__init__函数都想调用,可以在子类的__init__函数中加入对父类__init__函数的调用。
9、我们在使用时,尽量使用__init__函数,不要去自定义__new__函数,因为这两者在继承派生时的特性还是很不一样的。
10、将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节
【__init__方法】
【__new__方法】
__new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。
===》
具体的执行逻辑:
1. p = Person(name, age)
2. 首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls, ... ...) 这样的方式),
3. 然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self。
所以,__init__ 和 __new__ 最主要的区别在于:
1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
2.__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法。
【__new__的作用】
依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。
首先我们来看一下第一个功能,具体我们可以用int来作为一个例子:
假如我们需要一个永远都是正数的整数类型,通过集成 int,我们可能会写出这样的代码。
但运行后会发现,结果根本不是我们想的那样,我们任然得到了-3。这是因为对于int这种 不可变的对象,我们只有重载它的__new__方法才能起到自定义的作用。
这是修改后的代码:
通过重载__new__方法,我们实现了需要的功能。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
python函数的目的与意义_Python函数__new__及__init__作用及区别解析相关推荐
- python函数的目的与意义_Python函数的概念和使用
函数 为了便于程序的维护和更好的实现模块化,好的程序都会分解为很多函数. 可以这么说,对于任何的编程语言,函数都是一个非常重要的概念. python 不仅简化了函数的定义过程,而且还大量借鉴了其他函数 ...
- python info函数的作用是_Python函数__new__及__init__作用及区别解析
[同] 二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多. [异] __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是 ...
- person p = new person();_Python函数__new__及__init__作用及区别解析
[同] 二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多. [异] __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是 ...
- python列表和集合的异同_Python中的list与tuple集合区别解析
Python中内置了list集合与tuple集合,在list集合中可以实现元素的添加.修改.插入.以及删除.tuple集合看似与list类似,但两者还是有很大的区别. 在tuple集合中,一旦元素被存 ...
- python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用(3-20181205) 文章目录: 一. @staticmetho ...
- python采用函数式编程模式吗_Python函数与函数式编程
1 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创 ...
- python函数定义的语法形式_Python函数(函数定义、函数调用)使用详解
函数是 Python 程序的重要组成单位,一个 Python 程序可以由很多个函数组成.前面我们己经用过大量函数,如 len().max() 等,使用函数是真正开始编程的第一步. 比如在程序中定义了一 ...
- python 函数的定义与调用_Python函数定义和函数调用
我们已经使用了一些python内建函数,比如print().input().str()等等. 也使用了一些python自带模块的一些库函数,比如math模块的abs()函数. 函数定义: 语法:def ...
- python二重积分0到正无穷_python函数的数值二重积分
我有点困在一个函数上,我试图通过scipy,python进行数值积分.在 为了简单起见,我将函数定义为:integral f(x,y)= SUM[double integral(ax+by)dxdy] ...
最新文章
- Div span 标签详解
- cvs update 用法_WinCVS的配置与使用方法
- blender怎么移动骨骼_日本这款人形机器人竟是多个机器人乐队的前辈!拥有人类骨骼,还会击鼓...
- 云服务器可以安装操作系统么,云服务器安装操作系统吗
- C++ const关键字总结
- oracle扩容bigfile,Oracle10g BIGFILE表空间带来的好处
- LintCode——第K大元素
- Python如何在Dataframe中新添加一列
- [MySQL FAQ]系列 -- Linux命令行下快速监控mysql
- 行哥介绍29个国内外接私活渠道,总有一款适合你
- 卸载干净ARCGIS不用手动删注册表,一键用GEEK
- 数据科学风云之互联网金融
- 苹果PD快充数据线的MFi认证查询方法
- 传统手绘建模与次世代建模技术与流程的区别,在未来游戏行业中作为建模人如何做出职业规划
- 刷爆力扣之等价多米诺骨牌对的数量
- jetson机器上对lxde桌面设置中文输入法详细过程(图文展示)
- 人人都是产品经理读书笔记
- MFC实现弹出模态对话框和非模态对话框(基于对话框)
- SRAM与SDRAM的比较
- bandit game
热门文章
- 用Prim和Kruskal两种算法,求解最小生成树
- MNIST数据集处理
- js负数比较大小_【建阳童小|阅享数学(第十一期)】负数的由来
- Salesforce 超越 Oracle:四十年的甲骨文和二十岁的SaaS之王
- Oracle面对“数据倾斜列使用绑定变量”场景的解决方案
- MySQL和PostgreSQL在多表连接算法上的差异
- Oracle 18.3 : 透过告警日志从安装初始化过程看 18c 的新改变
- 三问三答,解传统企业敏捷转型担忧
- 如何去学好JS的8条小建议
- 机器学习笔记(十)---- KNN(K Nearst Neighbor)