【同】

二者均是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__作用及区别解析相关推荐

  1. python函数的目的与意义_Python函数的概念和使用

    函数 为了便于程序的维护和更好的实现模块化,好的程序都会分解为很多函数. 可以这么说,对于任何的编程语言,函数都是一个非常重要的概念. python 不仅简化了函数的定义过程,而且还大量借鉴了其他函数 ...

  2. python info函数的作用是_Python函数__new__及__init__作用及区别解析

    [同] 二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多. [异] __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是 ...

  3. person p = new person();_Python函数__new__及__init__作用及区别解析

    [同] 二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多. [异] __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是 ...

  4. python列表和集合的异同_Python中的list与tuple集合区别解析

    Python中内置了list集合与tuple集合,在list集合中可以实现元素的添加.修改.插入.以及删除.tuple集合看似与list类似,但两者还是有很大的区别. 在tuple集合中,一旦元素被存 ...

  5. python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用

    python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用(3-20181205) 文章目录: 一. @staticmetho ...

  6. python采用函数式编程模式吗_Python函数与函数式编程

    1 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创 ...

  7. python函数定义的语法形式_Python函数(函数定义、函数调用)使用详解

    函数是 Python 程序的重要组成单位,一个 Python 程序可以由很多个函数组成.前面我们己经用过大量函数,如 len().max() 等,使用函数是真正开始编程的第一步. 比如在程序中定义了一 ...

  8. python 函数的定义与调用_Python函数定义和函数调用

    我们已经使用了一些python内建函数,比如print().input().str()等等. 也使用了一些python自带模块的一些库函数,比如math模块的abs()函数. 函数定义: 语法:def ...

  9. python二重积分0到正无穷_python函数的数值二重积分

    我有点困在一个函数上,我试图通过scipy,python进行数值积分.在 为了简单起见,我将函数定义为:integral f(x,y)= SUM[double integral(ax+by)dxdy] ...

最新文章

  1. Div span 标签详解
  2. cvs update 用法_WinCVS的配置与使用方法
  3. blender怎么移动骨骼_日本这款人形机器人竟是多个机器人乐队的前辈!拥有人类骨骼,还会击鼓...
  4. 云服务器可以安装操作系统么,云服务器安装操作系统吗
  5. C++ const关键字总结
  6. oracle扩容bigfile,Oracle10g BIGFILE表空间带来的好处
  7. LintCode——第K大元素
  8. Python如何在Dataframe中新添加一列
  9. [MySQL FAQ]系列 -- Linux命令行下快速监控mysql
  10. 行哥介绍29个国内外接私活渠道,总有一款适合你
  11. 卸载干净ARCGIS不用手动删注册表,一键用GEEK
  12. 数据科学风云之互联网金融
  13. 苹果PD快充数据线的MFi认证查询方法
  14. 传统手绘建模与次世代建模技术与流程的区别,在未来游戏行业中作为建模人如何做出职业规划
  15. 刷爆力扣之等价多米诺骨牌对的数量
  16. jetson机器上对lxde桌面设置中文输入法详细过程(图文展示)
  17. 人人都是产品经理读书笔记
  18. MFC实现弹出模态对话框和非模态对话框(基于对话框)
  19. SRAM与SDRAM的比较
  20. bandit game

热门文章

  1. 用Prim和Kruskal两种算法,求解最小生成树
  2. MNIST数据集处理
  3. js负数比较大小_【建阳童小|阅享数学(第十一期)】负数的由来
  4. Salesforce 超越 Oracle:四十年的甲骨文和二十岁的SaaS之王
  5. Oracle面对“数据倾斜列使用绑定变量”场景的解决方案
  6. MySQL和PostgreSQL在多表连接算法上的差异
  7. Oracle 18.3 : 透过告警日志从安装初始化过程看 18c 的新改变
  8. 三问三答,解传统企业敏捷转型担忧
  9. 如何去学好JS的8条小建议
  10. 机器学习笔记(十)---- KNN(K Nearst Neighbor)