python类中的 __call__()方法详细描述使用

Python 类中一个非常特殊的实例方法,即 __call__()。该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。在类中实现这一方法可以使该类的实例(对象)像函数一样被调用。默认情况下该方法在类中是没有被实现的。使用callable()方法可以判断某对象是否可以被调用。
示例说明:

class Language:
    # 定义__call__方法
    def __call__(self,name,add):
        print("调用__call__()方法",name,add)
clangs = Language()
clangs("清如许qy","https://www.csdn.net/")

程序执行结果为:

调用__call__()方法 清如许qy https://www.csdn.net/

可以看到,通过在 Language 类中实现 __call__()方法,使的 clangs 实例对象变为了可调用对象。

Python 中,凡是可以将 () 直接应用到自身并执行,都称为可调用对象。可调用对象包括自定义的函数、Python 内置函数以及本节所讲的类实例对象。

对于可调用对象,实际上“名称()”可以理解为是“名称. __call__()”的简写。仍以上面程序中定义的 clangs 实例对象为例,其最后一行代码还可以改写为如下形式:

clangs.__call__("清如许qy","https://www.csdn.net/")

运行程序会发现,其运行结果和之前完全相同。

这里再举一个自定义函数的例子,例如:

class People(object):
    def __init__(self,name):
        self.name=name
    def __call__(self):
        print("hello "+self.name)
a = People('刘亦菲')
a.__call__()       # 调用方法一
a()                # 调用方法二

程序执行结果为:

hello 刘亦菲
hello 刘亦菲

__call__()object()这两种使用方式效果一样的现象,即调用方法一和调用方法二效果一样。
当不写__call__()时:

class Person(object):
    def __init__(self,name ,gender):
        self.name = name
        self.gender = gender
p = Person('Bob' , 'male')
p()

结果会报错:
在这里插入图片描述
当写__call__()时:

class Person(object):
    def __init__(self,name ,gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print('My name is %s...' % self.name )
        print('My friend is %s...' % friend)

p = Person('Bob' , 'male')
p('Tim')#-->p.__call__('Tim')

结果是正确的:
python类中的 __call__()方法详细描述使用_第1张图片
单看 p(‘Tim’) 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
其实p(‘Tim’)相当于 #–>p.__call__('Tim')
总结:
1.python 可调用对象:可以通过内置函数callable来判断,如:

print(callable(p)) 
"""若p为可调用对象时:返回为True"""
"""若p为不可调用对象时,返回为False"""

2.如果类定义了__call__方法,那么它的实例可以变为可调用对象

你可能感兴趣的:(Python,python,开发语言,pycharm,测试工具)