首页 > 解决方案 > 类和对象中方法的内存地址

问题描述

鉴于下面的代码

class A:
    def method():
        pass


obj1 = A()
obj2 = A()

print(hex(id(A.method)))
print(hex(id(obj1.method)))
print(hex(id(obj2.method)))

最后两个语句打印相同的地址,但第一个不打印。

为什么初始化对象时需要复制方法,而不是使用与类相同的地址?

标签: pythonpython-3.x

解决方案


它不是复制方法。

当您使用时,它会创建一个将方法绑定到该实例instance.method的新对象。bound method这类似于在不同环境中多次关闭同一函数。

请注意,实际上obj1.methodobj2.method绑定的方法对象并不相同。由于您没有保存任何一个对象,因此第一个对象被立即丢弃,其地址用于第二个对象。您可以通过将它们分配给变量来防止这种情况。

method1 = obj1.method
method2 = obj2.method
print(hex(id(method1)))
print(hex(id(method2)))

由于无法对对象进行垃圾回收,因此它们会获得不同的 ID。

有关这方面的其他示例,请参阅未命名的 Python 对象具有相同的 id


推荐阅读