美文网首页
python中的__init__()和__new__()的区别

python中的__init__()和__new__()的区别

作者: agamgn | 来源:发表于2020-02-14 07:53 被阅读0次

    前言

     用双下划线包围的特殊方法在python中被称为魔法方法,这里介绍python中的__init __和 __new __两个魔法方法。注: __new __方法在__init __之前执行。

    一、 __new __

     该方法主要是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。

    class A:
        def __new__(cls):
            return "abc"
    class B:
        pass
    
    print(A())#abc
    print(B())#<__main__.B object at 0x00000175E1E7DE48>
    

      __new __方法在类定义中不是必须写的,如果没定义,默认会调用object. __new __去创建一个对象。如果定义了,就是override,可以custom创建对象的行为。
     同时应该注意必须要有返回值,返回实例化出来的实例;在自己实现__new __()时需要注意:可以return父类(通过super(当前类名,cls)).__new __出来的实例

    二、__init __

     该方法是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。

    class A:
        def __init__(self,name):
            self.name=name
    
    a=A("agamgn")
    print(a.name)#agamgn
    

     这样便是__init __最普通的用法了。同时需要注意:
    1、有一个参数self,该self参数就是new()返回的实例;

    2、__init __()在__new __()的基础上完成初始化动作,不需要返回值;

    3.若__new __()没有正确返回当前类cls的实例,那__init __()将不会被调用

    4.创建的每个实例都有自己的属性,方便类中的实例方法调用;
    关于第三点:若__new __()没有正确返回当前的cls的实例,则__init __()不会被调用

    class B:
        def __new__(cls):
            print("__new__方法被执行")
    
        def __init__(self):
            print("__init__方法被执行")
    b=B()#__new __方法被执行
    

    正确方式:

    class C:
        def __new__(cls):
            print("__new__方法被执行")
            return super(C,cls).__new__(cls)
        def __init__(self):
            print("__init__方法被执行")
    c=C()
    

    总结

    本节代码

    相关文章

      网友评论

          本文标题:python中的__init__()和__new__()的区别

          本文链接:https://www.haomeiwen.com/subject/fhphxhtx.html