澄清Python教程文档

时间:2018-06-14 01:04:09

标签: python python-3.x python-2.7

我不清楚python教程文档中这一段的内容是什么。

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

  

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

根据我目前的理解,我认为它所说的是每当你在这个小片段的第8行引用类实例的属性时:

class MyClass():
    attribute = "I am an attribute"

    def func(self):
        return "I am a function"

instance = MyClass()
print(instance.func())

当python看到

instance.func()

它真正在做的事情并不是在寻找一种方法func"由" instance,它正在寻找func拥有的函数MyClass,然后将MyClass所拥有的函数调用instance作为self参数。

所以基本上它与:

相同
MyClass.func(instance)

我觉得我错过了一些微妙的东西。

我不明白这意味着什么
  

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

什么是抽象对象?

" pack"是什么意思?指针?

" pack"是什么意思?多指点?

如果python只是要查看instance的函数对象,为什么甚至有MyClass的方法对象?

为什么不让python让方法成为"拥有"他们的实例?为什么甚至要经历调用MyClass func而非instance' func的整个过程?

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

1 个答案:

答案 0 :(得分:1)

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

"填料"意味着它只是将这些东西收集到这个抽象对象中。

所以当你写

instance.func()

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

为什么这样?所以你可以传递这些东西:

foo = instance.func
foo()

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

方法由类拥有,以便类的所有实例自动获得相同的方法。这是OO编程的本质和类之间继承的基础。