对 Python 教程文档中一段内容的澄清

old*_*ile 5 python python-2.7 python-3.x

我不清楚 python 教程文档中的这一段落在说什么。

\n\n

(在这里找到:https://docs.python.org/3/tutorial/classes.html#method-objects

\n\n
\n

当引用的实例属性不是数据属性时,将搜索其类。如果名称表示有效的类属性是函数对象,则通过将实例对象和刚刚找到的函数对象打包(指向)在一个抽象对象中来创建方法对象:这就是方法对象。当使用参数列表调用方法对象时,会根据实例对象和参数列表构造一个新的参数列表,并使用该新参数列表调用函数对象。

\n
\n\n

根据我目前的理解,我认为它的意思是,每当您引用类实例的属性时,就像这个小片段的第 8 行所示:

\n\n
class MyClass():\n    attribute = "I am an attribute"\n\n    def func(self):\n        return "I am a function"\n\ninstance = MyClass()\nprint(instance.func())\n
Run Code Online (Sandbox Code Playgroud)\n\n

当蟒蛇看到

\n\n
instance.func()\n
Run Code Online (Sandbox Code Playgroud)\n\n

它真正做的不是寻找func“拥有”的方法instance,而是寻找func拥有的函数MyClass,然后调用拥有的函数MyClass作为instance参数self

\n\n

所以基本上它与以下内容相同:

\n\n
MyClass.func(instance)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我觉得我错过了一些微妙的东西。我不明白这是什么意思

\n\n
\n

...方法对象是通过将实例对象和刚刚找到的函数对象打包(指向)在一个抽象对象中而创建的:这就是方法对象。

\n
\n\n

什么是抽象对象?

\n\n

“打包”指针是什么意思?

\n\n

“打包”多个指针是什么意思?

\n\n

instance如果 python 只是要查看MyClass\ 的函数对象,为什么还要有一个方法对象呢?

\n\n

为什么 python 不让方法被它们的实例“拥有”呢?为什么还要经历调用MyClass\'sfunc而不是instance\'s的整个过程func

\n\n

为什么该语言的设计者决定这样做?

\n

Bar*_*mar 1

“抽象对象”意味着不一定创建真正的Python对象,它只是描述幕后发生的事情的一种方式,就好像创建了某个对象一样。

“打包”意味着它只是将这些东西收集在一起成为这个抽象对象。

所以当你写的时候

instance.func()
Run Code Online (Sandbox Code Playgroud)

它在内部创建了代表函数与实例相结合的东西。调用此函数时,将按照您的描述调用方法函数,并将实例作为第一个参数传递(通常命名为self)。

为什么要这样做?这样你就可以传递这些东西:

foo = instance.func
foo()
Run Code Online (Sandbox Code Playgroud)

的值foo包含表示与实例组合的函数的抽象对象。

方法由类拥有,因此类的所有实例都会自动获得相同的方法。这是OO编程的本质,也是类之间继承的基础。