【问题标题】:Clarification on a paragraph in the Python Tutorial Documentation澄清 Python 教程文档中的一段
【发布时间】:2018-06-14 01:04:09
【问题描述】:

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

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

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

根据我目前的理解,我认为它的意思是,每当你引用一个类实例的属性时,就像这个小 sn-p 的第 8 行一样:

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

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

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

当蟒蛇看到

instance.func()

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

所以基本上是一样的:

MyClass.func(instance)

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

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

什么是抽象对象?

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

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

如果 python 只是要查看 MyClass 的函数对象,为什么还要为 instance 提供方法对象?

为什么 python 不只是让方法被它们的实例“拥有”?为什么还要经历调用MyClassfunc而不是instancefunc的整个过程?

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

【问题讨论】:

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


【解决方案1】:

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

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

所以当你写的时候

instance.func()

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

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

foo = instance.func
foo()

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

方法归类所有,因此类的所有实例都会自动获得相同的方法。这是面向对象编程的精髓,也是类间继承的基础。

【讨论】:

  • 据我所知,python 是用 C 编写的,那么这个抽象对象在 C 中会是什么样子呢?当你在较低的层次上谈论它时,它是否具有更字面的含义?
猜你喜欢
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2018-09-28
  • 2017-11-26
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多