__init__与__new__这两个魔法方法组成了Python类对象的构造器,在Python类实例化时,其实最先调用的不是__init__而是__new__。__new__是负责实例化对象的,而__init__是初始化操作。__del__是析构器,当Python对象的所有引用都不存在了(被del了),就会自动触发__del__执行。

class CapStr(str):
def __new__(cls, string): #此时string = 'i love you' cls是CapStr这个类对象
string = string.upper()
return str.__new__(cls, string) #返回cls类带string参数的实例化的对象,但是这里为什么不直接return string ?看下面的代码段
def __del__(self):
print('__del__析构方法被调用了!')

>>> a = CapStr('i love you')
>>> b = a
>>> c = b
>>> del c
>>> del a
>>> del b
__del__析构方法被调用了!

由于CapStr类继承的是str这种不可修改的类型,所以,就不能在__init__方法中对str类型的数据进行自身的改变,这时候就要重写__new__来实现对不可变类型数据的修改。

1.a = CapStr('i love you')
2.首先执行使用'i love you'这个参数来执行CapStr类的__new__方法,这个__new__方法会返回CapStr类的一个实例(通常情况下是使用 super(CapStr, cls).__new__(cls, ... ...) 这样的方式),
3.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是__init__里面的的self
所以,__init__ 和 __new__ 最主要的区别在于:
1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后,它是实例级别的方法。
2.__new__ 通常用于控制生成一个新实例的过程,它是类级别的方法。

class CapStr(str):
def __new__(cls, string):
string = string.upper()
return string a = CapStr('mmy')

>>> type(a)
<class 'str'>

class CapStr(str):
def __new__(cls, string):
string = string.upper()
return str.__new__(cls, string)

>>> a = CapStr('mmy')
>>> type(a)
<class '__main__.CapStr'>

可以看出,二者返回的对象是不一样的。

注:str.__new__(cls, string)的实际意思是str(string),使用工厂函数str()将参数强制转换成str类型,然后再变成str的子类型CapStr

Python构造器及析构器:__init__与__new__及__del__的更多相关文章

  1. Python入门之面向对象的__init__和__new__方法

    Python入门之面向对象的__init__和__new__方法

  2. Swift中子类必须包含的构造器和析构器

    import Foundation /* Swift中子类必须包含的构造器 1.Swift允许在父类构造器前添加required关键字, 用于声明所有子类必须包含该required构造器 (如果没有声 ...

  3. Python面试进阶问题,__init__和__new__的区别是什么?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天这篇是Python专题的第17篇文章,我们来聊聊Python当中一个新的默认函数__new__. 上一篇当中我们讲了如何使用type函数 ...

  4. python的__init__和__new__

    本文所有实例代码在python3.7下 一.__new__和__init__区别 1.__new__先于__init__执行;__new__是相当于其他OOP语言的构造方法,负责创建实例:之后,__i ...

  5. 简述 Python 类中的 __init__、__new__、__call__ 方法

    任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使用.垃圾回收,不同的阶段由不同的方法(角色)负责执行. 定义一个类时,大家用得最多的就 ...

  6. Python中的__init__和__new__介绍

    介绍 首先我们要知道在面向对象编程中,实例化基本遵循创建实例对象.初始化实例对象.最后返回实例对象这么一个过程. Python 中的 __new__ 方法负责创建一个实例对象,__init__ 方法负 ...

  7. python中的__init__ 、__new__、__call__小结

    这篇文章主要介绍了python中的__init__ .__new__.__call__小结,需要的朋友可以参考下 1.__new__(cls, *args, **kwargs)  创建对象时调用,返回 ...

  8. Swift构造器(Initializer)与析构器(Deinitializer)

    为了初始化结构体和类等类型的实例属性. 默认构造器 struct Fahrenheit { var temperature: Doubleinit(){ temperature = 32.0 } } ...

  9. 详解python中的__init__与__new__方法

    一.__init__和__new__方法执行的顺序? 在面向对象中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行. 二.__new__方法是什么? 首先,我们先来看下 ...

随机推荐

  1. DB-MDM:MDM/主数据管理 百科

    ylbtech-DB-MDM:MDM/主数据管理 百科 主数据管理(MDM Master Data Management)描述了一组规程.技术和解决方案,这些规程.技术和解决方案用于为所有利益相关方( ...

  2. SqL语句基础之增删改查

    增查删改的SQL语句,如此的实用,下面我就来简单介绍一下它简单的用法. 1.什么是SQL? SQL是用于访问和处理数据库的标准的一种计算机语言. 2.SQL可以做什么?  (1)可以向数据库进行查询 ...

  3. 测开之路七十四:python处理kafka

    kafka-python地址:https://github.com/dpkp/kafka-python 安装kafka-python:pip install kafka-python 接收消息 fro ...

  4. shtml与html

    前言 在浏览网页的时,忽然发现了一个网址不是以[.html]结尾,而是[.shtml].顿时勾起了我的好奇心,这是什么鬼?于是打开google,开始维基. SHTML 什么是 SHTML 使用SSI( ...

  5. Visual Studio中把文件夹导入工程中

    VS用到的功能还是太少,记录备忘. 有的时候需要把其他库的源码导入当前工程直接使用,而这个库是源码形式,又带很多目录的. 之前从没遇到过这种情况,自己的库目录自己新建,添加. 第三方库一般有单独的Pr ...

  6. centos 6.x 配置 mail 发送外部邮件详解和 sendmail 使用简介

    一.mail基本配置 1.配置:vim /etc/mail.rc 在文件末尾追加以下内容: set from=@.com # 别名<123456789@163.com> set smtp= ...

  7. Linux系统中创建大文件,并作为文件系统使用

    在LInux系统的使用过程中,有时候会遇到诸如某个磁盘分区的大小不够用了,导致其下的文件系统不能正常写入数据.亦或者是系统swap分区太小,不够用或者不满足条件而导致的其他一系列问题.如果我们系统上挂 ...

  8. zabbix入门之配置邮件告警

    zabbix入门之配置邮件告警 邮件环境搭建 使用本地邮箱账号发送邮件 zabbix-server 端安装 mailx .sendmail或者psotfix 服务,系统默认安装好了postfix #安 ...

  9. HDU4089/Uva1498 Activation 概率DP(好题)

    题意:Tomato要在服务器上激活一个游戏,一开始服务器序列中有N个人,他排在第M位,每次服务器会对序列中第一位的玩家进行激活,有四种结果: 1.有p1的概率会激活失败,这时候序列的状态是不变的.2. ...

  10. Codeforces 722E 组合数学 DP

    题意:有一个n * m的棋盘,你初始在点(1, 1),你需要去点(n, m).你初始有s分,在这个棋盘上有k个点,经过一次这个点分数就会变为s / 2(向上取整),问从起点到终点的分数的数学期望是多少 ...