python - 在python中从类vs对象调用函数

标签 python function class object

我实际上正在经历 descriptors python 文档并遇到了这个例子

>>> class D(object):
     def f(self, x):
          return x

>>> d = D()
>>> D.__dict__['f'] # Stored internally as a function
<function f at 0x00C45070>
>>> id(D.__dict__['f']) # Memory location
49294384
>>> D.f             # Get from a class becomes an unbound method
<unbound method D.f>
>>> id(D.f )
48549440
>>> d.f             # Get from an instance becomes a bound method
<bound method D.f of <__main__.D object at 0x00B18C90>>
>>> id(d.f)
48549440

所以从上面的代码中,我了解到当我们直接访问时,python将类的函数定义/声明作为一个单独的对象存储在类__dict__变量内部使用 __dict__ 变量,它的内存位置为 49294384

但为什么当通过 Class 或 Object 访问时,它显示为具有不同 内存位置 48549440 的不同函数/方法对象?D.f 和 d.f

当我们使用 __dict__ 变量访问时,它不应该引用同一个对象吗?。如果是,为什么?

最佳答案

D.f 是一个接受一个参数的函数 (self)

x = D.f
x(d)

d.f 是一个“绑定(bind)方法”,即 self 参数已经填充的函数。你可以说

x = d.f
x()

因此它不能与 D.f 相同,必须位于不同的位置。

关于python - 在python中从类vs对象调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50345763/

相关文章:

python - 用于映射的漏勺模式,其中键是可变的,但值是数组

python - 使用 Python 的 Google App Engine 上的 key 或 ID

c - C中静态函数的优先级

C 是否有允许动态函数调用的解决方法?

class - Groovy/Grails - 如何从 String 获取类实例?

python - 在不同的 scipy ode 求解器之间互换

python - ctypes 是否为枚举和标志提供任何东西?

c - C语言扑克软件原型(prototype),找出顺子功能的问题

c# - 从类或抽象类继承

c++ - 为什么尝试在类中设置静态变量时出现链接器错误?