c语言编程笔录

首页 >   > 笔记大全

笔记大全

用Python实现自定义可调用对象

更新时间:2023-11-12

Python自定义可调用对象的实现

Python中,可调用对象是指可以像函数一样进行调用的任何对象。比如函数、类以及实现了 __call__ 方法的对象。要实现可调用对象,需要对类进行修饰或者实现 __call__ 方法。

实现可调用对象的修饰器

可通过修饰器将类转化为可以进行函数式调用的可调用对象,修饰器可以接受一个类作为参数并返回一个新的可调用对象,这个新的类可以像函数一样进行调用。

class MyCallable:
  def __init__(self, func):
    self.func = func
  
  def __call__(self, *args, **kwargs):
    print("Calling:", self.func.__name__)
    return self.func(*args, **kwargs)

@MyCallable
def add(a, b):
  return a + b

add(1, 2)
该代码将输出 "Calling: add",并返回3.这里定义了一个MyCallable修饰器,这个修饰器接受一个类作为参数,重写了这个类的 __call__ 方法,将实例化后的类变成可调用对象,这个可调用对象可以像函数一样进行调用。

使用 __call__ 方法实现可调用对象

除了用修饰器实现可调用对象外,还可以通过在类中实现 __call__ 方法来实现可调用对象。

class MyCallable:
  def __call__(self, *args, **kwargs):
    print(sum(args))

my_obj = MyCallable()
my_obj(1, 2, 3, 4)
该代码将输出10,这里定义了一个类MyCallable,并在类中实现了 __call__ 方法。在类实例化后,可以像函数一样进行调用。

使用可调用对象进行函数参数传递

由于可调用对象可以像函数一样进行调用,因此可作为函数的参数进行传递。

class MyCallable:
  def __call__(self, a, b):
    print(a + b)

def caller(func):
  func(2, 3)

my_obj = MyCallable()
caller(my_obj)
该代码将输出5,这里定义了一个类MyCallable以及一个caller函数,在caller函数中传递可调用对象,这个可调用对象中实现了 __call__ 方法,用于对传递的参数进行运算。

总结

Python中,可调用对象是指可以像函数一样进行调用的任何对象。可以通过修饰器或重写 __call__ 方法来实现可调用对象。可调用对象可以像函数一样进行调用,并且可以作为函数的参数进行传递。这种特性在实现一些高级特性和框架中非常有用。