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()
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')
结果是正确的:
单看 p(‘Tim’) 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
其实p(‘Tim’)相当于 #–>p.__call__('Tim')
总结:
1.python 可调用对象:可以通过内置函数callable来判断,如:
print(callable(p))
"""若p为可调用对象时:返回为True"""
"""若p为不可调用对象时,返回为False"""
2.如果类定义了__call__
方法,那么它的实例可以变为可调用对象