python - 类和对象中方法的内存地址
问题描述
鉴于下面的代码
class A:
def method():
pass
obj1 = A()
obj2 = A()
print(hex(id(A.method)))
print(hex(id(obj1.method)))
print(hex(id(obj2.method)))
最后两个语句打印相同的地址,但第一个不打印。
为什么初始化对象时需要复制方法,而不是使用与类相同的地址?
解决方案
它不是复制方法。
当您使用时,它会创建一个将方法绑定到该实例instance.method
的新对象。bound method
这类似于在不同环境中多次关闭同一函数。
请注意,实际上obj1.method
和obj2.method
绑定的方法对象并不相同。由于您没有保存任何一个对象,因此第一个对象被立即丢弃,其地址用于第二个对象。您可以通过将它们分配给变量来防止这种情况。
method1 = obj1.method
method2 = obj2.method
print(hex(id(method1)))
print(hex(id(method2)))
由于无法对对象进行垃圾回收,因此它们会获得不同的 ID。
有关这方面的其他示例,请参阅未命名的 Python 对象具有相同的 id
推荐阅读
- amazon-web-services - 将 Namecheap 域添加到 AWS Elastic Beanstalk
- javascript - 来自儿童的上下文 API setState
- c# - c#在word(docx)中添加文本并应用样式
- sql - CROSS APPLY 用于 CASE 表达式
- javascript - 滚动鼠标时 Flexbox 行不滚动
- c# - 找不到现有文件
- java - dragAndDropBy()、dragAndDrop()、moveToElement 等的行为非常奇怪
- flutter - 如何使用 GestureDetector 的 onForcePress 属性?
- python - 走十分钟(代码战)- Python
- ruby-on-rails - Sidekiq 在 Rails 应用程序中导致内存膨胀