在看神经网络代码的时候,类定义中总是会出现__call__方法,它是Python类体中可以定义的一个特殊方法,定义了该方法的对象称为可调用对象,即该对象可以像函数一样被调用。
定义一个可以求解自由落体下降高度的对象
类的实例:如果类定义了 __call__
方法,那么它的实例可以作为函数调用。每执行一次实例,__call__函数就执行一遍:
可以理解为 实例() ==实例.__call__()
class GDistance:
def __init__(self, g):
self.g = g
def __call__(self, t):
# 自由落体下降距离 s=g*t^2
return (self.g * t ** 2)/2
调用对象
e_gdist = GDistance(9.8)
for t in range(11):
print("%d 秒 下降%.2f 米" %(t, e_gdist(t)))
输出结果
0 秒 下降0.00 米
1 秒 下降4.90 米
2 秒 下降19.60 米
3 秒 下降44.10 米
4 秒 下降78.40 米
5 秒 下降122.50 米
6 秒 下降176.40 米
7 秒 下降240.10 米
8 秒 下降313.60 米
9 秒 下降396.90 米
10 秒 下降490.00 米
总之:如果一个类中定义了 __call__ 方法,那么该类的实例可以作为函数调用,并执行__call__方法所定义的内容。
- class CLanguage:
- # 定义__call__方法
- def __call__(self,name,add):
- print(“调用__call__()方法”,name,add)
- clangs = CLanguage()
- clangs(“C语言中文网”,”http://c.biancheng.net”)
程序执行结果为:
调用__call__()方法 C语言中文网 http://c.biancheng.net
可以看到,通过在 CLanguage 类中实现 __call__() 方法,使的 clangs 实例对象变为了可调用对象。
Python 中,凡是可以将 () 直接应用到自身并执行,都称为可调用对象。可调用对象包括自定义的函数、Python 内置函数以及本节所讲的类实例对象。
对于可调用对象,实际上“名称()”可以理解为是“名称.__call__()”的简写。仍以上面程序中定义的 clangs 实例对象为例,其最后一行代码还可以改写为如下形式:
clangs.__call__("C语言中文网","http://c.biancheng.net")