Python “获取项目”和“列”属于哪个模块?
在试图理解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
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)
而没有指定如何实现这种等价。啊,从来没有注意到这一点。是的,文档一般使用对象
(对于类方法,类
)来实现任何可以实现方法的对象,不管实际的类对象
是否这样做。