我见过几次对对象类型而不是对象本身调用方法。其原因可能是什么,尤其是使用特殊方法时?
文档中的示例: “例如,如果一个类定义了一个名为 _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/