Python __call__ 特殊方法实战示例

标签 python methods call magic-methods

我知道类中的 __call__ 方法是在调用类的实例时触发的。但是,我不知道什么时候可以使用这种特殊方法,因为可以简单地创建一个新方法并执行在 __call__ 方法中完成的相同操作,而不是调用实例,您可以调用该方法.

如果有人给我这个特殊方法的实际用法,我将不胜感激。

最佳答案

本示例使用 memoization ,基本上将值存储在表中(在本例中为字典),以便您以后查找它们而不是重新计算它们。

这里我们使用带有 __call__ 方法的简单类来计算阶乘(通过 callable object ),而不是包含静态变量的阶乘函数(因为这在 Python 中是不可能的)。

class Factorial:
    def __init__(self):
        self.cache = {}
    def __call__(self, n):
        if n not in self.cache:
            if n == 0:
                self.cache[n] = 1
            else:
                self.cache[n] = n * self.__call__(n-1)
        return self.cache[n]

fact = Factorial()

现在你有了一个可调用的 fact 对象,就像所有其他函数一样。例如

for i in xrange(10):                                                             
    print("{}! = {}".format(i, fact(i)))

# output
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880

而且它也是有状态的。

关于Python __call__ 特殊方法实战示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5824881/

相关文章:

Scala 编译器在使用泛型的方法中显示 "No TypeTag available for T"

javascript - 运行一些代码的 jQuery 函数

java - 如何获取调用者(或调用者的调用者,或更深入的调用堆栈)实例 ID - my.package.MyClass@3e7bfc04

python - 找不到 GraphViz 的可执行文件(python 3 和 pydotplus)

python - 有没有办法将列表插入到 python 中的 .format 方法中?

python - Azure 功能应用程序未显示在 Azure 门户中

java - in.hasNextLine() 在 Java 中永不终止

c# - 将 lambda 表达式作为参数传递,然后使用参数执行该 lambda

javascript - 关于 JavaScript 数组原型(prototype)

python - Tensorflow,在给定条件下更改张量值