核心概念与区别

1. __init__():实例的 “初始化器”

  • 作用:当你创建类的实例(obj = MyClass())时,Python 会先调用 __new__() 创建实例对象,紧接着自动调用 __init__() 为这个实例初始化属性。
  • 触发时机:创建实例的那一刻(类名())。
  • 特点:第一个参数是 self(代表刚创建的实例),没有返回值(只能返回 None)。

2. __call__():实例的 “可调用化”

  • 作用:让类的实例可以像函数一样被调用(obj()),相当于给实例赋予了 “函数行为”。
  • 触发时机:当调用实例对象时(实例名())。
  • 特点:第一个参数也是 self,可以有返回值,也可以接收参数。

3. 两者的关系:先后与分工

  • __init__() 是 “创建实例并初始化” 的环节,是 __call__() 能被触发的前提(没有实例,就无法调用实例)。

__call__() 是 “实例被当作函数调用” 的环节,是对实例功能的扩展,和 __init__() 没有直接的调用关系,但依赖 __init__() 初始化后的实例。

  • 基础范例:
class A:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.z = x + y
        print(f"init: x = {self.x}, y = {self.y}, z = {self.z}")

    def __call__(self,x,y):
        self.x = x
        self.y = y
        print(f"call: x = {self.x}, y = {self.y}, z = {self.z}")

    def func(self):
        print(f"func: x = {self.x}, y = {self.y}, z = {self.z}")


a = A(1,2)  # 执行__init__,获得A对象a  # init: x = 1, y = 2, z = 3
a.func()  # func: x = 1, y = 2, z = 3
a(3, 4)   # 执行__call__  # call: x = 3, y = 4, z = 3
a.func()   # func: x = 3, y = 4, z = 3
  • 有返回值的__call()__:
class A:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.z = x + y
        print(f"init: x = {self.x}, y = {self.y}, z = {self.z}")

    def __call__(self,x,y):
        self.x = x
        self.y = y
        print(f"call: x = {self.x}, y = {self.y}, z = {self.z}, return: {x + y}")
        return x + y

    def func(self):
        print(f"func: x = {self.x}, y = {self.y}, z = {self.z}")


a = A(1,2)  # 执行__init__,获得A对象a  # init: x = 1, y = 2, z = 3
a.func()  # func: x = 1, y = 2, z = 3
a1 = a(3, 4)   # 执行__call__  # call: x = 3, y = 4, z = 3, return: 7
a.func()  # func: x = 3, y = 4, z = 3

利用 __call__ 让类实例具备装饰器的功能:

import time


class A:
    def __init__(self, func):
        self.func = func

    def __call__(self, x, y):
        print("延时5秒后运行")
        time.sleep(5)
        return self.func(x, y)

@A
def function(x,y):
    return x + y

print(function(3,4))

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐