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作业
    爬虫综合大作业
    爬取全部校园新闻
    理解爬虫原理
    中文词频统计与词云生成
    复合数据类型,英文词频统计
    字符串操作、文件操作,英文词频统计预处理
    了解大数据的特点、来源与数据呈现方式
    Hadoop综合大作业
    分布式文件系统HDFS
  • 原文地址:https://www.cnblogs.com/GumpYan/p/12362594.html
Copyright © 2011-2022 走看看