python - 使用 type(obj).method() 而不是 obj.method() 的原因是什么?

标签 python methods magic-methods

我见过几次对对象类型而不是对象本身调用方法。其原因可能是什么,尤其是使用特殊方法时?

文档中的示例: “例如,如果一个类定义了一个名为 _getitem_() 的方法,并且 x 是该类的实例,则 x[i] 大致相当于 type(x)。 _getitem_(x, i)。” https://docs.python.org/3/reference/datamodel.html#special-method-names

我意识到这个问题可能太笼统,但如果您能列出可以使用这种模式的可能情况,并提供一些相关文档的链接,我将不胜感激。

最佳答案

这样做的主要原因是为了模拟how special methods are looked up implicitly 。当你这样做时len(seq) ,底层代码(大部分)相当于 type(seq).__len__(seq) ,绕过实例本身(防止某人分配给 seq.__len__ 并更改 len 在该实例中的行为方式)。如果您正在编写旨在匹配所述行为的代码(绕过实例属性而支持类属性),那么这是一个近似值。

请注意,您在本示例中阅读的文档并不建议您使用大致等效的方法。他们解释了语法如何映射到底层方法调用,并明确它绕过了实例属性查找,仅此而已。除了最奇怪的情况外,您不应该实际编写该代码(某些 C 加速模块的 Python 级别实现,其中 Python 实现由 PyPy 使用,很少由 CPython 使用,可能会使用此代码来获得准确的行为兼容性,无论使用的是 Python 代码还是 C 加速代码),但了解何时确实需要确切的兼容性,或者何时正确性稍好一些,例如the Python implementation of functools.total_ordering 使用此方法来查找丰富的比较方法,就像 < 的运算符形式一样。和公司在幕后做的事情。

关于python - 使用 type(obj).method() 而不是 obj.method() 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74455225/

相关文章:

ruby - 未找到 Mandrill ruby​​ gem 的方法——从示例中剪切和粘贴

python-3.x - 所有 Python dunder 方法的列表 - 您需要实现哪些方法才能正确代理对象?

php - __callStatic 未被调用

php自动对象到数组的转换

python - Julia 是否有与 Python 相同的方式来读取和写入数据(数组和字符串)?

python - 用另一个数组索引一个 numpy 数组

python - 如何使用 ctypes 和 tesseract 3.0.2 识别数据而不是文件名?

c# - 我如何从库调用方法到 C# 控制台

java - 将方法的答案保留到小数点后两位

python - 脚本在 Linux 上不起作用