__call__方法和可调用对象

在看神经网络代码的时候,类定义中总是会出现__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__方法所定义的内容。

  1. class CLanguage:
  2. # 定义__call__方法
  3. def __call__(self,name,add):
  4. print(“调用__call__()方法”,name,add)
  5. clangs = CLanguage()
  6. 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")

发表评论

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