码迷,mamicode.com
首页 > 编程语言 > 详细

python3--__call__拦截调用

时间:2017-08-08 15:25:30      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:编写   __call__   这不   int   call   val   构造   bsp   重载   

__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__拦截调用

标签:编写   __call__   这不   int   call   val   构造   bsp   重载   

原文地址:http://www.cnblogs.com/chenlin163/p/7306406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!