,

python可调用对象

让对象变成可调用对象 正常情况实例只是对象,只能通过.访问属性或方法 在类中定义 __call__ 方法,实例…

让对象变成可调用对象

正常情况实例只是对象,只能通过.访问属性或方法

在类中定义 __call__ 方法,实例就变成了可调用对象:

class Adder:
   def __init__(self, n):
       self.n = n

   def __call__(self, x):
       return self.n + x

add_5 = Adder(5)
print(callable(add_5))   # True
# add_5(10) 等效于 Adder.__call__(add_5, 10)
print(add_5(10))         # 15,像函数一样调用
print(add_5(100))        # 105

关键理解:

  • __call__实例可以像函数一样被调用
  • 调用实例时,传入的参数会传给 __call__ 方法

实际应用场景

1. 实现可配置的函数对象

class Multiplier:
   def __init__(self, factor):
       self.factor = factor

   def __call__(self, value):
       return self.factor * value

double = Multiplier(2)
triple = Multiplier(3)

print(double(5))   # 10
triple(5)   # 15

2. 实现状态保持的回调函数

class Logger:
   def __init__(self, prefix):
       self.prefix = prefix
       self.log_count = 0

   def __call__(self, message):
       self.log_count += 1
       print(f"[{self.prefix}] #{self.log_count}: {message}")

error_log = Logger("ERROR")
error_log("文件未找到")     # [ERROR] #1: 文件未找到
error_log("网络连接失败")   # [ERROR] #2: 网络连接失败

下面代码的输出是什么?为什么?

class A:
    def __call__(self):
        print("A called")

class B(A):
    def __call__(self):
        print("B called")
        super().__call__()

b = B()
b()
#B called
#A called

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor