面向对象创建对象的执行过程

72 阅读1分钟

在 Python 中,当你创建一个类的实例并调用它时,涉及到 __new____init____call__ 时,它们的执行顺序如下:

  1. __new__ 方法: __new__ 方法是在实例创建之前调用的。它的主要作用是创建并返回一个新的实例。如果 __new__ 返回一个实例,那么接下来会调用 __init__ 方法;如果 __new__ 返回 None,则不会调用 __init__ 方法。
  2. __init__ 方法: __init__ 方法是在实例创建之后调用的。它的主要作用是对实例进行初始化,可以在这里进行属性的设置等操作。__init__ 方法不需要返回值。
  3. __call__ 方法: 如果一个类的实例对象被调用,那么 Python 解释器会检查是否存在 __call__ 方法。如果存在,则调用这个方法。__call__ 方法允许类的实例像函数一样被调用,接收参数并执行特定的操作。
  4. 下面是一个简单的示例,演示了这三者的执行顺序:

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__ is called")
        instance = super(MyClass, cls).__new__(cls)
        return instance

    def __init__(self, *args, **kwargs):
        print("__init__ is called")

    def __call__(self, *args, **kwargs):
        print("__call__ is called")

# 创建实例
obj = MyClass()

# 调用实例
obj()

image.png

可以理解为,面相对象在创建对象的时候,先用__new__返回返回一个实例对象,里面没有东西,然后__init__把一些参数给加进去,最后才会执行__call__方法