python,class的__init__()与__call__()两个特殊方法的关系
·
核心概念与区别
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))
更多推荐



所有评论(0)