__call__
前言
- 该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。
- 作用:为了将类的实例对象变为可调用对象。
代码解释
class CLanguage:
# 定义__call__方法
def __call__(self,name,add):
print("调用__call__()方法",name,add)
clangs = CLanguage()
clangs("C语言中文网","http://c.biancheng.net")
clangs.__call__("C语言中文网","http://c.biancheng.net")
### 运行结果
调用__call__()方法 C语言中文网 http://c.biancheng.net
调用__call__()方法 C语言中文网 http://c.biancheng.net
可以看到类中实现 call() 方法,使的 clangs 实例对象变为了可调用对象。
需要注意
- 类实例对象包含的方法,其实也属于可调用对象,但类属性却不是
class CLanguage:
def __init__ (self):
self.name = "C语言中文网"
self.add = "http://c.biancheng.net"
def say(self):
print("我正在学Python")
clangs = CLanguage()
if hasattr(clangs,"name"):
print(hasattr(clangs.name,"__call__"))
print("**********")
if hasattr(clangs,"say"):
print(hasattr(clangs.say,"__call__"))
#### 运行结果
False
**********
True
可以看到,由于 name 是类属性,它没有以 call 为名的 call() 方法;
而 say 是类方法,它是可调用对象,因此它有 call() 方法。
其他实例
1.函数本身可以被调用
def func():
pass
print(callable(func))
#### 运行结果
True
2.类本身可以被调用
### 主要用作生成实例化对象
class Fun:
def __init__(self):
pass
print(callable(Fun))
### 输出结果:
True
3.类的实例化对象无法被调用
class Fun:
def __init__(self):
pass
a = Fun()
print(callable(a))
### 输出结果:
False
4.将类实例化对象变为可调用
### 可以通过增加__call__()函数,将类实例化对象变为可调用
class Fun:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
pass
a = Fun()
print(callable(a))
### 输出结果:
True