zoukankan      html  css  js  c++  java
  • 通俗讲解python__new__()方法

    通俗讲解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中真正的类构造器。

  • 相关阅读:
    Google是不是真的不能用了?非常奇怪的问题
    九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题
    UNIX网络编程卷1 时间获取程序server TCP 协议相关性
    uva 1557
    C经典之14-双向链表存储1-10---ShinePans
    Java 内部类
    HiPAC高性能规则匹配算法之查找过程
    Objective-C之成魔之路【9-类构造方法和成员变量作用域、以及变量】
    NSRange,判断字符串的各种操作~
    NSRange类详解
  • 原文地址:https://www.cnblogs.com/demiao/p/11461349.html
Copyright © 2011-2022 走看看