Python魔法之__call__
什么是魔法方法?
python中的魔法方法是指方法名以两个下划线开头并以两个下划线结尾的方法,因此也叫Dunder Methods (Double Underscores),常用于运算符重载。
魔法方法会在对类的某个操作时自动调用,而不需要自己直接调用。
__call__有什么用?
Python中的对象分为可调用对象与不可调用对象,显而易见,函数是可调用对象,因为函数通过()
执行并返回值。
def func(a:int,b:int)->int:
return a+b
print(callable(func))
print(callable(func(1,2)))
True
False
但是类的实例呢?这就轮到__call__出场了!
随便定义一个类:
class student:
def __init__(self,height,weight):
self.height=height
self.weight=weight
a=student(172,60)
print(callable(a))
结果是False
,说明student
的实例是不可调用对象。
然后为student
类添加__call__
方法后:
class student:
def __init__(self,height,weight):
self.height=height
self.weight=weight
def __call__(self,words:str):
print(words)
a=student(172,60)
print(callable(a))
a("I'm a fool!")
结果如下:
True
I'm a fool!
说明添加__call__
方法之后,student
变为了可调用对象。
注意:Pytorch
框架中有不少地方className.__call__(params) <==> className.forward(params)