__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
posted @ 2022-05-05 21:27  大切切  阅读(17)  评论(0编辑  收藏  举报