python3--__call__攔截調用
阿新 • • 發佈:2017-08-08
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__攔截調用