1. 程式人生 > >python3--__call__攔截調用

python3--__call__攔截調用

blog print all class brush pre clas com 就會

__call__攔截調用

當實例調用時,使用__call__方法。不,這不是循環定義:如果定義了,Python就會為實例應用函數調用表達式運行__call__方法。這樣可以讓類實例的外觀和用法類似於函數。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class Prod:
    def __init__(self, value):
        self.value = value
    def __call__(self, other):
        return self.value * other

x = Prod(2)
print(x(3))
print(x(4))

運行結果:

6
8

在這個例子中,__call__似乎沒什麽特別的意義。下面這個簡單的方法也能提供類似功能。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class Prod:
    def __init__(self, value):
        self.value = value
    def comp(self, other):
        return self.value * other

x = Prod(3)
print(x.comp(3))
print(x.comp(4))

運行結果:

9
12

然而,當需要為函數的API偏寫接口時,__call__就變得很有用:這可以編寫遵循所需要的函數來調用接口對象,同時又能保留狀態信息。事實上,這可能是除了__init__構造方法以及_str__和__repr_顯示格式方法外,第三個最常用的運算符重載方法了。

python3--__call__攔截調用