知行编程网知行编程网  2022-11-09 19:00 知行编程网 隐藏边栏  3 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python __call__方法(详解版)的相关知识,包括call的形式有哪些,以及js call方法这些编程知识,希望对大家有参考作用。

Python __call__ 方法(​​详细版)

我们用 hasattr() 函数判断指定属性(或方法)是否存在,但到底是属性还是方法,则需要进一步判断它是否可调用。程序可通过判断该属性(或方法)是否包含 __call__ 属性来确定它是否可调用。

例如如下程序:

class User:
    def __init__(self, name, passwd):
        self.name = name
        self.passwd = passwd
    def validLogin (self):
        print('验证%s的登录' % self.name)       
u = User('crazyit', 'leegang')
# 判断u.name是否包含__call__方法,即判断是否可调用
print(hasattr(u.name, '__call__')) # False
# 判断u.passwd是否包含__call__方法,即判断是否可调用
print(hasattr(u.passwd, '__call__')) # False
# 判断u.validLogin是否包含__call__方法,即判断是否可调用
print(hasattr(u.validLogin, '__call__')) # True

上面程序中的粗体代码分别判断User对象的name、passwd、validLogin是否包含__call__方法。如果包含这个方法,则表示可调用,否则表示不可调用。

从上述程序的输出不难看出,对于name和passwd这两个属性,由于不可调用,所以程序在判断是否包含__call__方法时输出False;对于validLogin方法,由于是callable,所以程序判断是否包含__call__方法时输出True。

事实上,一个函数(甚至是一个对象)执行的关键在于__call__()方法。实际上 x(arg1, arg2,...) 只是 x.__call__(arg1, arg2, ...) 的一个快捷方式,所以我们甚至可以在自定义类中添加一个 __call__ 方法,让该类的实例也变成了可调用的。例如下面的代码:

# 定义Role类
class Role:
    def __init__ (self, name):
        self.name = name
    # 定义__call__方法
    def __call__(self):
        print('执行Role对象')
r = Role('管理员')
# 直接调用Role对象,就是调用该对象的__call__方法
r()

上面程序的最后一行代码使用函数调用语法来调用对象,这看起来可能不对,但是由于Role类提供了__call__方法,所以调用对象的本质是执行对象的__call__方法。运行上面的代码,你会看到如下输出:

执行Role对象


对于程序中的函数,同样既可使用函数的语法来调用它,也可把函数当成对象,调用它的 __call__ 方法。例如如下示例代码:

def foo ():
    print('--foo函数--')
# 下面示范了2种方式调用foo()函数
foo()
foo.__call__()

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享