python:实例方法绑定是如何在内存中发生的

Python: How does instance method binding happen in memory

本问题已经有最佳答案,请猛点这里访问。

我正在学习方法绑定,并试图理解解释器如何在特定类型的对象和它的实例方法之间建立连接。假设我编写了以下代码:

1
2
3
4
5
6
7
8
9
10
class Point:
    def __init__(self, x,y):
        self._x=x
        self._y=y

    def draw(self):
        print(self._x, self._y)

p1=Point(1,2)
p1.draw()

我听说draw是一个实例方法。如果是这样,那么draw存储在哪里?我知道属性存储在一个字典中,字典的键是属性名,值是属性的值,但是我正在努力在实例方法和对象本身之间建立联系。它们是存储在类存储在内存中的位置,还是存储在对象(p1)中?怎么用?


可以说,方法也是类中的属性,它们基本上是绑定到类的函数。你可以用Class.__dict__看到它们。

使用Point.__dict__时,它返回如下映射:

1
2
3
4
5
6
mappingproxy({'__module__': '__main__',
              '__init__': <function __main__.Point.__init__(self, x, y)>,
              'draw': <function __main__.Point.draw(self)>,
              '__dict__': ,
              '__weakref__': ,
              '__doc__': None})

可以看到draw是类Point内的函数对象,self是实例。

也可以使用此语法调用这些方法,因为draw属于类Point

1
Point.draw(p1)

这和

1
p1.draw()