zoukankan      html  css  js  c++  java
  • 通俗的讲解Python中的__new__()方法

    通俗的讲解Python中的__new__()方法

    一、总结

    一句话总结:

    a、可以发现__new__方法是传入类(cls),而__init__方法传入类的实例化对象(self),
    b、相当于__new__是开辟疆域的大将军,而__init__是在这片疆域上辛勤劳作的小老百姓,
    c、只有__new__执行完后,开辟好疆域后,__init__才能工作,结合到代码,也就是__new__的返回值正是__init__中self。

    二、通俗的讲解Python中的__new__()方法

    转自或参考:通俗的讲解Python中的__new__()方法
    https://blog.csdn.net/sj2050/article/details/81172022?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

    python的__init__()方法就相当于认识了类构造器,然而__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__的返回值正是__init__中self。

    我们可以看下面这个例子:

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

    2691640428616
    2691640428616
    2691640428616

    上面这段代码的内容很简单,在__new__中打印一下返回值的id,在__init__中打印一下self的id值,最后再打印一下创建的这个类的id值(所谓的id值也就是内存地址),我们可以看到最后的输出结果是一致的,这也就说明,整个类的地盘是由__new__函数"开辟出来的",而到了__init__内部就只能在这片地盘上"修修补补"了。

     
  • 相关阅读:
    2019-2020-2 网络对抗技术 20175318 Exp0 kali Linux系统的安装(雾
    手动编译 TCP BBR v2 Alpha/Preview 内核
    Adobe Flash Player解除限制版
    ABBYY FineReader 15.0.18.1494 Corporate Multilingual破解
    易语言5.9精简学习增强版
    Debian9 快速开启 TCP BBR 实现高效单边加速
    ucosii-2(选做)
    Ubuntu 18.04/18.10快速开启Google BBR的方法
    基于 Nginx 的 v2+websocket+tls 域名伪装
    Google TCP升级版加速:BBR 2.0对比BBR Plus
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13156731.html
Copyright © 2011-2022 走看看