You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python方法归属类或对象?实例方法内存与查找机制疑问

Python方法与实例的内存及查找机制问题解答

疑问1:Python中的方法属于对象还是类?

普通实例方法本质上属于类。你在类定义里编写的方法,是存储在类的命名空间中的,并不是每个实例单独存储一份。

疑问2:实例的内存占用与方法查找机制

  • 实例变量(比如代码里的self.name)是每个实例单独在内存中拥有的,因为每个实例的属性值可能存在差异。
  • 实例方法不会被每个实例复制一份,否则确实会造成大量内存浪费。当实例调用方法时,Python会做一个绑定操作:把当前实例作为第一个参数(也就是self)绑定到类的方法上,生成一个临时的绑定方法对象。

方法查找流程和类变量的查找逻辑类似:

  • 当你调用instance.method()时,Python先在实例自身的__dict__(存储实例属性的字典)里查找是否有method这个属性;
  • 如果找不到,就去实例所属类的__dict__里找对应的方法;
  • 找到后,将这个类方法与当前实例绑定,生成绑定方法,再执行该方法(自动把实例作为self传入)。

代码中的特殊现象解释

看你提供的代码:

class Person:

    last_name = "doe"
    
    def __init__(self, name):
        self.name = name
    
    def full_name(self):
        print(f"{self.name} {self.last_name}")
    
jane = Person("jane")
john = Person("john")
jane.full_name()

print(jane.full_name == john.full_name)  # False
print(jane.full_name is john.full_name)  # False
print(id(jane.full_name), id(john.full_name))  # 139827998611904 139827998611904  

出现id相同但==和is都为False的原因是:
当你访问jane.full_name时,Python会动态创建一个绑定到jane的绑定方法对象,这条语句执行完后,这个临时对象就会被垃圾回收器回收。当你访问john.full_name时,又会创建一个绑定到john的新绑定方法对象,刚好复用了之前被回收的内存地址,所以两者的id相同。但这两个是完全不同的对象(分别绑定了不同的实例),因此用==和is判断都会返回False。

内容的提问来源于stack exchange,提问作者kbl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:01:24