Python的可调用对象

在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()__

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值