【问题标题】:Python: How does instance method binding happen in memory [duplicate]Python:实例方法绑定如何在内存中发生[重复]
【发布时间】:2018-10-14 07:00:59
【问题描述】:

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

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)一起存储?如何?

【问题讨论】:

  • 如果你想让你的问题得到完整的回答,恐怕你应该阅读源代码并自己找到答案,如果你熟悉C(假设你在说关于 Cpython 实现)。

标签: python python-3.x object methods


【解决方案1】:

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

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

mappingproxy({'__module__': '__main__',
              '__init__': <function __main__.Point.__init__(self, x, y)>,
              'draw': <function __main__.Point.draw(self)>,
              '__dict__': <attribute '__dict__' of 'Point' objects>,
              '__weakref__': <attribute '__weakref__' of 'Point' objects>,
              '__doc__': None})

可以看到drawPoint类内部的一个函数对象,self是实例。

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

Point.draw(p1)

相同
p1.draw()

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2020-12-24
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多