在Python中,除了用户自定义的函数,内置函数外,调用运算符()还可以应用到其它对象上。如果想要判断一个对象是否可调用,可以使用callable()函数判断。
def add(a, b):
return a + b
print(callable(add))
True
Python 中,大约有以下7类可调用对象。
一、用户自定义的函数:
使用def语句或者lambda表达式创建的函数。
def add(a, b):
return a + b
add_l = lambda a, b : a + b
print("function add is callable:",callable(add))
print("function add_1 is callable:",callable(add_l))
function add is callable: True function add_1 is callable: True
二、内置函数:
使用C语言实现的函数,如len、sum或者time.strftime
print("function len() iscallable:", callable(len))
function len() iscallable: True
三、内置方法:
使用C语言实现的方法,如dict.get()
四、类方法:
在类的定义体中定义的函数。
五、类:
调用类时会运行类的 __new__
方法创建一个实 例,然后运行 __init__
方法,初始化实例,最后把实例返回给调用方。因为 Python 没有 new
运算符,所以调用类相当于调用函数。(通常,调用类会创建那个类的实例,不过覆盖 __new__
方法的话,也可能出现其他行为。)
六、类的实例:
如果类定义了__call__方法,那么它的实例可以作为函数进行调用。并且__call__方法可以进行自定义重写。
七、生成器函数:
使用yield关键字的函数或方法。调用生成器函数返回的是生成器对象。
以下具体说明类实例的可调用化:
只要在Class中,有一个非常特殊的实例方法 __call__()。 该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。
class School():
def __init__(self, name):
self.name = name
def __call__(self):
print("Name:", self.name)
school = School("Second Middle School")
school()
Name: Second Middle School
实际使用:
我们使用paddlepaddle来创建模型,常常以paddle.nn.Layer作为基类:
class MNIST(paddle.nn.Layer):
def __init__(self):
super(MNIST, self).__init__()
self.fc = paddle.nn.Linear(in_features=784, out_features=1)
# 定义网络结构的前向计算过程
def forward(self, inputs):
outputs = self.fc(inputs)
return outputs
在使用这个class时,
# 声明网络结构
model = MNIST()
images = norm_img(data[0]).astype('float32')
labels = data[1].astype('float32')
#前向计算的过程
predicts = model(images)
这就是因为,paddle.nn.Layer定义了方法__call()__