美文网首页
特殊方法 __init__.()

特殊方法 __init__.()

作者: import_hello | 来源:发表于2018-09-19 16:25 被阅读0次

    转载须注明出处:简书@Orca_J35

    __init__

    object.__init__(self[, ...])

    在新式类中, __new__ 用于控制新实例的创建过程,__init__ 用于控制新实例的初始化过程。如果 __new__ 的返回值是当前类的实例,之后便会调用该实例的 __init__ 方法,来对实例进行初始化。在完成初始化后才会将实例返回给调用者。

    __init__ 的实参由"实例引用"和"构造器实参列表"共同组成,也就是说 __new____init__ 除了第一个参数不同之外,其余参数均相同__init__ 只能返回 None,否则会抛出 TypeError

    假设基类中定义了 __init__ 方法,如果派生类中覆写了 __init__ 方法,则在派生类的 __init__ 方法中必须显式调用父类中的 __init__ 方法,以确保能够正确初始化实例的基类部分,如:super().__init__([args...])

    a. Tips

    • 在旧式类中并没有 __new__ 方法,只有 __init__ 方法,如果我们定义如下旧类:

      # -*- coding: utf-8 -*-
      # python2
      class oldStyleClass:
          def __new__(cls):
              # 旧式类在构造实例的过程中,不会调用__new__方法
              print("into __new__")
      
          def __init__(self):
              print("into __init__")
      
      
      oldStyleClass()
      

      输出结果将会是:

      into __init__
      

      可见,旧式类在实例化的过程并不会调用 __new__ 方法。

    • 只要返回值是 cls 的实例,便会调用该实例的 __init__ 方法,无论是否已经调用过:

      class AbstractClass(object):
          def __new__(cls, a, b):
              instance = super(AbstractClass, cls).__new__(cls)
              instance.__init__(a, b)
              return instance  # 只要返回实例便会调用init,所以这里会调用两次
      
          def __init__(self, a, b):
              print("into __init__")
      
      
      AbstractClass(1, 2)
      

      输出:

      into __init__
      into __init__
      
    赞赏.jpg

    相关文章

      网友评论

          本文标题:特殊方法 __init__.()

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