博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通俗讲解python__new__()方法
阅读量:5292 次
发布时间:2019-06-14

本文共 1581 字,大约阅读时间需要 5 分钟。

目录

通俗讲解python__new__()方法

转载于别人的博客https://blog.csdn.net/sj2050/article/details/81172022

引子:

曾经我幼稚的以为认识了python的__init__()方法就相当于认识了类构造器,结果,new()方法突然出现在我眼前,让我突然认识到原来__new__才是老大。为什么这么说呢?

​ 我们首先得从__new__(cls[,...])的参数说说起,__new__方法的第一个参数是这个类,而其余的参数会在调用成功后全部传递给__init__方法初始化,这一下子就看出了谁是老子谁是小子的关系。

所以,__new__方法(第一个执行)先于__init__方法执行:

class A:    pass class B(A):    def __new__(cls):        print("__new__方法被执行")        return super().__new__(cls)    def __init__(self):        print("__init__方法被执行") b = B()---------------------------------------执行结果为:__new__方法被执行__init__方法被执行

​ 我们比较两个方法的参数,可以发现__new__方法是传入类(cls),而__init__方法传入类的实例化对象(self),而有意思的是,__new__方法返回的值就是一个实例化对象(ps:如果__new__方法返回None,则__init__方法不会被执行,并且返回值只能调用父类中的__new__方法,而不能调用毫无关系的类的__new__方法)。我们可以这么理解它们之间的关系,__new__是开辟疆域的大将军,而__init__是在这片疆域上辛勤劳作的小老百姓,只有__new__执行完后,开辟好疆域后,__init__才能工作。

绝大多数情况下,我们都不需要自己重写__new__方法,但在当继承一个不可变的类型(例如str类,int类等)时,它的特性就尤显重要了。我们举下面这个例子:

class CapStr(str):    def __init__(self,string):        string = string.upper() a = CapStr("I love China!")print(a)------------------------------执行结果为:I love China!
class CapStr(str):    def __new__(cls,string):        string = string.upper()        return super().__new__(cls,string) a = CapStr("I love China!")print(a)--------------------------------------------执行结果为:I LOVE CHINA!

​ 我们可以根据上面的理论可以这样分析,我们知道字符串是不可改变的,所以第一个例子中,传入的字符串相当于已经被打下的疆域,而这块疆域除了将军其他谁也无法改变,__init__只能在这块领地上干瞪眼,此时这块疆域就是”I love China!“。而第二个例子中,__new__大将军重新去开辟了一块疆域,所以疆域上的内容也发生了变化,此时这块疆域变成了”I LOVE CHINA!“。

小结:

__new__和__init__想配合才是python中真正的类构造器。

转载于:https://www.cnblogs.com/demiao/p/11461349.html

你可能感兴趣的文章
C#字符串string的常用使用方法
查看>>
3.6.使用STC89C52控制MC20解析GPS的经纬度数据上传到指定服务器
查看>>
Could not load driverClass com.mysql.jdbc.Driver错误
查看>>
路飞学城-爬虫集训营-第一章
查看>>
技术人员应真正学会的第二课程
查看>>
[洛谷P3628] [APIO2010]特别行动队
查看>>
《集体智慧编程》第12章:算法总结
查看>>
Hbase配置运行
查看>>
【转载】"30年---我与赛灵思FPGA的故事”:ZYNQ-7000使用总结(6)——AXI接口简述...
查看>>
Jenkins系列-Jenkins通过Publish over SSH插件实现远程部署
查看>>
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.
查看>>
Java 中int、String的类型转换
查看>>
Oracle 查看正在执行的SQL语句
查看>>
HDU 1069 Monkey and Banana
查看>>
一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?...
查看>>
consonant combination
查看>>
堆排序
查看>>
elk报错解决
查看>>
centos6更改时区
查看>>
struts中请求数据自动封装
查看>>