types.MethodType 与 functools.partial 之比较

2 投票
1 回答
1090 浏览
提问于 2025-04-17 03:57

这是我之前提问的延续(python 闭包 + 面向对象编程)。在那个问题的回答中,Winston Ewert 建议我使用 functools.partial,而不是 types.MethodType

所以我现在的问题是:这两者有什么区别?为什么使用 functools 的方式被认为更好呢?

补充一下,我已经成功地用 functools.partial 实现了我的闭包,感觉真的很不错。:-)

1 个回答

4

从实际的角度来看,这两者之间并没有太大的区别。部分函数可以处理任意数量的参数(在这个例子中是1个);而实例方法会把当前对象(self)传递给被包装的函数;它们实际上是在做同样的事情!

不同之处在于,它们在某种程度上能够自我说明。在你提到的问题中,closure 可调用对象并不是任何东西的方法;它只是一个普通的函数,由 A 的一个方法返回。恰好这个函数的主体将 B 的一个实例作为第一个参数,但这并不足以让它成为 B 的“方法”。

所以这只是风格的问题。你做的事情看起来更像是 functools.partial,所以你应该使用它,尽管你也可以用 types.MethodType 达到同样的效果。

撰写回答