zoukankan      html  css  js  c++  java
  • 面向对象之魔术方法__init__()和__new__()

    魔术方法:

    魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发

    1.__init__

    初始化魔术方法
    触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)
    参数:至少有一个self,接收对象
    返回值:无
    作用:初始化对象的成员
    注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有

    2.__new__

    实例化魔术方法
    触发时机: 在实例化时触发
    参数:至少一个cls 接收当前类
    返回值:必须返回一个对象实例
    作用:实例化对象
    注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
    没事别碰这个魔术方法,先触发__new__才会触发__init__ 

    class Person:
        def __init__(self, name):
            print("---->init方法")
            self.name = name
    
        def __new__(cls, *args, **kwargs):
            print("---->new")
    
    
    p = Person('Jack')
    print(p)
    print(p.name)
    

    可以看到__init__()方法没有执行,这是什么原因?

     __init__()依赖__new__(),原来系统里面有__new__()方法的,可以帮助执行__init__()方法,现在我们自己实现了一个__new__()方法,这样就把系统的__new__()方法覆盖了

    也就是说,当实例化时,p = Person(),先进入到__new__()方法中

    class Person:
        def __init__(self):
            print("---->init方法")
            # self.name = name
    
        def __new__(cls, *args, **kwargs):
            print("---->new")
            return object.__new__(cls, *args, **kwargs)
    
    
    p = Person()
    

     __new__()的真正作用:向内存要空间--->地址

    class Person:
        # 初始化(构造方法),创建对象是自动执行
        def __init__(self, name):
            print("---->init方法")
            self.name = name
    
        def __new__(cls, name):
            print("---->new")
            # 不知道new方法是做什么的,那么就直接返回父类的new方法
            return super(Person, cls).__new__(cls)
    
    
    p = Person('Jack')
    

     总之:

    因此可以这么描述__new__()和__ini__()的区别,在新式类中__new__()才是真正的实例化方法,为类提供外壳制造出实例框架,然后调用该框架内的构造方法__init__()使其丰满。

    如果以建房子做比喻,__new__()方法负责开发地皮,打下地基,并将原料存放在工地。而__init__()方法负责从工地取材料建造出地皮开发招标书中规定的大楼,__init__()负责大楼的细节设计,建造,装修使其可交付给客户。

    https://www.cnblogs.com/zhangboblogs/p/7860929.html

    https://blog.csdn.net/Mr_fengzi/article/details/93360845

  • 相关阅读:
    hadoop 2.6.0 LightWeightGSet源码分析
    推断扫描后的内容是否是URL
    Merge Sorted Array
    带条件的分页【重点】
    第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数
    php持续集成环境笔记
    hdu5137 How Many Maos Does the Guanxi Worth(单源最短路径)
    求最长公共子序列
    集团公司(嵌入ETL工具)財务报表系统解决方式
    ADT+NDK搭建jni编译环境
  • 原文地址:https://www.cnblogs.com/GumpYan/p/12362594.html
Copyright © 2011-2022 走看看