1. 判断一个对象是否可调用: callable(对象名)
def work1():
pass
work2 = [1, 2]
res = callable(work1) # 返回TRUE: 函数可以调用,(函数名work2而不是work2())
res1 = callable(work2) # 返回FALSE: 列表不可以调用
print(res, res1)
work1()
以上结论:函数可以调用,列表不可以调用。
2. Python 中,凡是可以将 () 直接应用到自身并执行,都称为可调用对象。
可调用对象包括自定义的函数、Python 内置函数以及一些类实例对象。
对于可调用对象,实际上“名称()”可以理解为是“名称.call()”的简写
class MyClass:
a = 1
def __call__(self, a, b, *args, **kwargs):
return a + b
def work(self):
print("sss")
obj = MyClass()
print(callable(obj))
print(obj(1, 2)) # 对象() 触发的就是__call__方法 等同于 print(obj.__call__(2,10))
print(obj.__call__(2,10))
3. 用 call() 弥补 hasattr() 函数的短板
hasattr() 函数的用法,该函数的功能是查找类的实例对象中是否包含指定名称的属性或者方法,
但该函数有一个缺陷,即它无法判断该指定的名称,到底是类属性还是类方法。
要解决这个问题,我们可以借助可调用对象的概念。要知道,类实例对象包含的方法,其实也属于可调用对象,但类属性却不是。
class MyClass:
def __init__(self):
self.name = "lizi"
self.add = "aa"
def say(self):
print("hello,world")
obj1 = MyClass()
if hasattr(obj1, "name"):
print(hasattr(obj1.name, "__call__"))
print("**********")
if hasattr(obj1, "say"):
print(hasattr(obj1.say, "__call__"))