Python “获取项目”和“列”属于哪个模块?

Python “获取项目”和“列”属于哪个模块?,python,python-3.x,oop,inheritance,Python,Python 3.x,Oop,Inheritance,在试图理解python上的“魔法”或特殊方法以及阅读时,我的印象是任何对象都会有这些方法 如果我们做一些简单的事情,比如 class ClassicSpam: pass dir(ClassicSpam()) 我得到的结果是: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt

在试图理解python上的“魔法”或特殊方法以及阅读时,我的印象是任何对象都会有这些方法

如果我们做一些简单的事情,比如

class ClassicSpam:
    pass

dir(ClassicSpam())
我得到的结果是:

['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']
我试图从类和继承的角度来理解这是如何工作的

是什么使得我们内部“知道”的任何履行本合同的调用都将调用
object.\uu getitem\uuuu(self,key)


也许这不是正确的方法,我认为太像java了,但我想了解我遗漏了什么,以及在我实现的类中实现u getitem时会发生什么。

部分解释:字节码指令负责计算像
a[b]
这样的表达式。它调用,其中(除其他外)检查对象的类型和MRO,以确定它是否有可以调用的
\uuuu getitem\uuuu
方法。大多数双下划线方法都是以类似的方式调用的。您认为为什么会调用
object.\uu\getitem\uu
object
没有定义
\uuuu getitem\uuuu
,因此任何对未定义或继承
\uuuuu getitem\uuuuuu
的类进行索引的尝试都会引发
类型错误
,而不是调用
对象。\uuuu getitem\uuuuu
(除非您误用了
super
)。如果您问
self[key]
如何“知道”如何调用
self.\uu getitem\uuuuuuuu(key)
,那是因为Python的实现(在C中)就是这样工作的。如果你问它为什么会这样做,那是因为Python的核心优势之一是能够定义低级方法并自动利用语言的高级语法:
\uuuu iter\uuuu
->
for thing in self:
\uu getitem\uuuu
->
self[thing]
,等等。最终,这是一个实现细节。Python语言只是定义了
foo[x]
等同于
type(foo)。\uuu getitem\uuu(foo,x)
而没有指定如何实现这种等价。啊,从来没有注意到这一点。是的,文档一般使用
对象
(对于类方法,
)来实现任何可以实现方法的对象,不管实际的类
对象
是否这样做。