我不清楚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
的整个过程?
为什么语言的设计者决定这样做?
答案 0 :(得分:1)
"抽象对象"意味着不一定要创建一个真正的Python对象,它只是一种描述幕后发生的事情的方式,就像创建了一些对象一样。
"填料"意味着它只是将这些东西收集到这个抽象对象中。
所以当你写
instance.func()
它在内部创建表示与实例结合的功能的东西。调用此方法时,将按照您的描述调用方法函数,并将实例作为第一个参数传递(通常命名为self
)。
为什么这样?所以你可以传递这些东西:
foo = instance.func
foo()
foo
的值包含表示与实例结合的函数的抽象对象。
方法由类拥有,以便类的所有实例自动获得相同的方法。这是OO编程的本质和类之间继承的基础。