python__call__ Python内置函数之callable函数解读

python__call__ Python内置函数之callable函数解读

目录
  • 1. 函数定义与基本用法
  • 2. 可调用对象类型
    • (1) 函数和技巧
    • (2) 类
    • (3) 实现__call__技巧的实例
    • (4) 内置可调用对象
  • 3. 不可调用对象类型
    • (1) 基本数据类型
    • (2) 列表、字典等容器
    • (3) 模块
  • 4. 实战案例
    • 案例 1:函数参数验证
    • 案例 2:动态调用对象
    • 案例 3:实现可配置的回调函数
    • 案例 4:模拟函数装饰器
  • 5. 注意事项
    • 6. 拓展资料

      在 Python 中,callable()一个内置函数,用于检查一个对象是否可调用(即是否可以像函数一样被调用)。这篇文章小编将详细解析其用法、返回值及实战案例。

      1. 函数定义与基本用法

      callable(object) -> bool

      功能:判断对象是否可调用。

      返回值

      • True:对象可被调用(如函数、技巧、类、实例等)。
      • False:对象不可被调用(如整数、字符串、列表等)。

      2. 可调用对象类型

      (1) 函数和技巧

      def add(a, b): return a + bclass Calculator: def multiply(self, a, b): return a bprint(callable(add)) 输出: Trueprint(callable(Calculator().multiply)) 输出: True

      (2) 类

      类可被调用(调用时会创建实例):

      print(callable(Calculator)) 输出: Trueobj = Calculator() 类被调用,创建实例

      (3) 实现__call__技巧的实例

      如果类定义了__call__技巧,则其实例可被调用:

      class Adder: def __call__(self, a, b): return a + badder = Adder()print(callable(adder)) 输出: Trueprint(adder(3, 4)) 输出: 7(实例被调用)

      (4) 内置可调用对象

      len()print()等:

      print(callable(len)) 输出: True

      3. 不可调用对象类型

      (1) 基本数据类型

      x = 42s = “hello”print(callable(x)) 输出: Falseprint(callable(s)) 输出: False

      (2) 列表、字典等容器

      lst = [1, 2, 3]dct = “a”: 1}print(callable(lst)) 输出: Falseprint(callable(dct.get)) 输出: True(get是技巧,可调用)

      (3) 模块

      import mathprint(callable(math)) 输出: Falseprint(callable(math.sqrt)) 输出: True

      4. 实战案例

      案例 1:函数参数验证

      确保传入的参数是可调用对象:

      def apply_function(func, x): if not callable(func): raise TypeError(“func必须是可调用对象”) return func(x)result = apply_function(lambda x: x2, 5) 正常 apply_function(42, 5) 报错:TypeError

      案例 2:动态调用对象

      根据条件选择调用不同的函数:

      def add(a, b): return a + bdef subtract(a, b): return a – boperation = add if True else subtractprint(callable(operation)) 输出: Trueprint(operation(5, 3)) 输出: 8

      案例 3:实现可配置的回调函数

      class EventHandler: def __init__(self, callback=None): self.callback = callback if callable(callback) else lambda x: None def handle_event(self, data): self.callback(data) 使用自定义回调def log_data(data): print(f”Logging: data}”)handler = EventHandler(log_data)handler.handle_event(“Event occurred”) 输出: Logging: Event occurred 使用默认回调(无操作)handler = EventHandler()handler.handle_event(“Silent event”) 无输出

      案例 4:模拟函数装饰器

      在调用函数前验证其可调用性:

      def ensure_callable(func): if not callable(func): raise ValueError(“传入的不是可调用对象”) def wrapper(args, kwargs): print(f”Calling func.__name__}…”) return func(args, kwargs) return wrapper@ensure_callabledef greet(name): return f”Hello, name}!”print(greet(“Alice”)) 输出: Calling greet… n Hello, Alice!

      5. 注意事项

      callable()返回True不保证调用成功:

      class BadCallable: def __call__(self): raise Exception(“Cannot be called”)obj = BadCallable()print(callable(obj)) 输出: True obj() 报错:Exception

      Python 3.0 vs 3.2+

      • 在 Python 3.0 中,callable()曾被移除,后在 3.2 中重新添加。
      • 若需兼容 3.0,可使用hasattr(obj, &039;__call__&039;)替代。

      6. 拓展资料

      callable()一个简单但实用的工具,常用于:

      • 参数验证:确保传入的对象可被调用。
      • 动态编程:根据条件选择调用不同的函数或技巧。
      • 框架开发:实现回调机制、装饰器等功能。

      通过结合callable()和其他 Python 特性(如高阶函数、类的__call__技巧),可以编写出更加灵活和健壮的代码。

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

      无论兄弟们可能感兴趣的文章:

      • Python中callable技巧的使用
      • Pythoncallable函数使用技巧详解
      • Python中报错“TypeError:‘list‘objectisnotcallable”难题及解决
      • 浅谈python内置函数callable的用法
      • Python基于callable函数检测对象是否可被调用
      • Python callable内置函数原领会析
      版权声明

      为您推荐