介绍

首先我们要知道在面向对象编程中,实例化基本遵循创建实例对象、初始化实例对象、最后返回实例对象这么一个过程。

Python 中的 __new__ 方法负责创建一个实例对象,__init__ 方法负责将该实例对象进行初始化。

__new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() 启动之前,__new__() 决定是否要使用该 __init__() 方法,因为__new__() 可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。

__new__(),第一个参数cls是当前正在实例化的类。

class Example(object):

def __init__(self, *args, **kwargs):

pass

def __new__(cls, *args, **kwargs):

return object.__new__(cls, *args, **kwargs)

重点:

事实上如果(新式)类中没有重写__new__()方法,即在定义新式类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。

而如果新式类中重写了__new__()方法,那么你可以自由选择任意一个的其他的新式类(必定要是新式类,只有新式类必定都有__new__(),因为所有新式类都是object的后代,而经典类则没有__new__()方法)的__new__()方法来制造实例,包括这个新式类的所有前代类和后代类,只要它们不会造成递归死循环。

如果__new__()没有返回cls(即当前类)的实例,那么当前类的__init__()方法是不会被调用的。如果__new__()返回其他类(新式类或经典类均可)的实例,那么只会调用被返回的那个类的构造方法。

__new__ 的作用

依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。

首先我们来看一下第一个功能,具体我们可以用int来作为一个例子:

假如我们需要一个永远都是正数的整数类型,通过集成int,我们可能会写出这样的代码。

class ExampleInteger(int):

def __init__(self, value):

super(ExampleInteger, self).__init__(self, abs(value))

i = ExampleInteger(-3)

print i

但运行后会发现,结果根本不是我们想的那样,我们任然得到了-3。这是因为对于int这种 不可变的对象,我们只有重载它的__new__方法才能起到自定义的作用。

这是修改后的代码:

写法一:

class ExampleInteger(int):

def __new__(cls, value):

return int.__new__(cls, abs(value))

i = ExampleInteger(-3)

print i

写法二:

class ExampleInteger(int):

def __new__(cls, value):

return super(ExampleInteger, cls).__new__(cls, abs(value))

i = ExampleInteger(-3)

print i

通过重载__new__方法,我们实现了需要的功能。

super

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

python __init__ __new___Python中的__init__和__new__介绍相关推荐

  1. python包的中 _init _.py文件介绍

    python包的中 _init _.py文件介绍 我们新建python包时常常会看到一个__init _.py文件. 作用介绍: ​ 一:这个文件是属于python包的,这个文件用作于标识python ...

  2. python文件夹中的__init__.py的作用

    一个目录如果包含了__init__.py文件,那么他就变成了一个包(package). __init__可以是空的,但是必须存在,其他程序才能从这个目录中导入相应的模块或函数. 例如data文件夹下有 ...

  3. python中def _init_是什么意思_python中的__init__(self)是什么意思呢

    __init__(self)这个时类的初始化函数 classObj:def __init__(self):print 1obj= Obj() #这时候__init__这个函数会被调用,self指obj ...

  4. python里endswith_Python中endswith()函数的基本使用

    Python中endswith()函数的基本使用 函数:endswith() 作用:判断字符串是否以指定字符或子字符串结尾,常用于判断文件类型 相关函数:判断字符串开头 startswith() 一. ...

  5. 浅谈 Python 中的 __init__ 和 __new__

    2019独角兽企业重金招聘Python工程师标准>>> 1.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,_ ...

  6. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  7. Python模块包中__init__.py文件的作用

    2019独角兽企业重金招聘Python工程师标准>>> 在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自 ...

  8. python中def _init_是什么意思_详细解读Python中的__init__()方法

    __init__()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是__init__()参数值可以有多种形式. 因为有很多 ...

  9. Python模块包中__init__.py文件的作用(转载)

    用django做开发已经一年多的时间,但基本没注意python模块中__init__.py文件存在的意义,偶然看到对它的介绍吓一大跳,这个文件太重要了 模块包: 包通常总是一个目录,目录下为首的一个文 ...

最新文章

  1. 数据库书籍大师推荐的Oracle数据库相关的书籍,收集汇总。
  2. 110. Leetcode 714. 买卖股票的最佳时机含手续费 (动态规划-股票交易)
  3. SQL注入_1-6_user-agent注入
  4. c++ STL平常练习-1
  5. linux 文档编辑器 word,linux下vi编辑器命令大全
  6. python安装caffe_Linux下caffe的安装
  7. 使用java类加载器,报异常java.nio.file.InvalidPathException
  8. 学python用什么软件-零基础初学python需要安装哪些软件?希望对你们有帮助
  9. 【POJ1958】【典型递推问题】汉诺塔问题
  10. Lobooi个人作业:阅读与准备作业
  11. oracle IMP命令导入导出DMP文件
  12. Socket协议脚本编写
  13. 利用 CSS 实现文字二次加粗和多重边框效果
  14. 图书销售系统 php,php文学小说销售系统
  15. Jmeter 阶梯线程组
  16. 可惜我是水瓶座 你不懂的水瓶座,不为人知的秘密
  17. 如何给照片加边框?图片加边框的3个实用方法
  18. Java 获取指定日期
  19. Gitee上传代码保姆级教程(亲测有效)
  20. 基于51单片机的简易示波器(STC89C51 ADC0804 12864 )

热门文章

  1. 中秋水文 | 安利一发国漫
  2. 很现实、很暴力的面试法则 —— 来自招聘官的自述
  3. 如何把一个运行完好的Kafka搞崩溃
  4. Uber的一键式聊天智能回复系统
  5. ffplay.c学习-7-以音频同步为基准
  6. 数据结构与算法之转圈打印矩阵和旋转正方形矩阵
  7. RTMPdump(libRTMP) 源代码分析 7: 建立一个流媒体连接 (NetStream部分 2)
  8. 如何使用git上传本地文件到码云上【详细步骤】
  9. 今日的你,上班了吗?
  10. shell脚本获取系统的前一天日期,格式为yyyymmdd