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
相关产品推荐
相关产品推荐

