class Stuff(object):
def __init__(self, x, y, range):
super(Stuff, self).__init__()
self.x = x
self.y = y
self.range = range
def __call__(self, x, y):
self.x = x
self.y = y
print '__call__ with (%d,%d)' % (self.x, self.y)
def __del__(self):
del self.x
del self.y
del self.range
>>> s = Stuff(1, 2, 3)
>>> s.x
1
>>> s(7, 8)
__call__ with (7,8)
>>> s.x
7
在元类中定义自定义的
__call__()
方法允许将类的实例作为函数调用,而不是总是修改实例本身。第一个用于初始化新创建的对象,并接收用于执行此操作的参数:
第二个实现函数调用运算符。
在Python中,函数是一类对象,这意味着:函数引用可以在其他函数和/或方法的输入中传递,并从它们内部执行。
类的实例(aka Objects)可以视为函数:将它们传递给其他方法/函数并调用它们。为了实现这一点,必须专门化
__call__
类函数。def __call__(self, [args ...])
它接受可变数量的参数作为输入。假设x
是类X
的实例,x.__call__(1, 2)
类似于调用x(1,2)
或实例本身作为函数。在Python中,
__init__()
被正确定义为类构造函数(而__del__()
是类析构函数)。因此,在__init__()
和__call__()
之间有一个净的区别:第一个构建类up的实例,第二个使这样的实例可以作为函数调用,而不会影响对象本身的生命周期(即__call__
不会影响构造/销毁生命周期),但是它可以修改其内部状态(如如下所示)。例如。
相关问题 更多 >
编程相关推荐