Python中self.l与类名.l的区别及使用self的原因
Python类中self.l和Test.l的区别及最佳实践
两段代码的核心区别
两段代码的差异在于访问列表l的方式:
- 第一段用
self.l:从当前实例的属性查找链中获取l——先找实例自身有没有l属性,没有的话再去类上找。 - 第二段用
Test.l:直接访问类本身的l属性,完全跳过实例的属性查找。
具体差异可以通过两个场景体现:
- 实例自定义属性时
如果给某个Test实例单独设置了l属性,两段代码的行为会不一样:
obj = Test() obj.l = ['x', 'y'] obj.t('x') # 第一段代码会判定'a在self.l里'(因为self.l是实例自己的['x','y']) # 第二段代码会判定'a不在Test.l里'(Test.l始终是类上的['a','b','c'])
- 子类继承重写时
如果有子类继承Test并重新定义了l,两段代码的逻辑也会分化:
class SubTest(Test): l = ['d', 'e'] sub_obj = SubTest() sub_obj.t('d') # 第一段代码会匹配(self.l取子类SubTest的l) # 第二段代码不会匹配(还是取父类Test的l)
为什么应该用带self的版本
支持多态与继承
面向对象的核心优势之一就是多态,用self.l能让子类通过重写l属性来改变方法t的行为,不需要修改父类的代码逻辑,扩展性更强。允许实例个性化
每个实例可以拥有自己独立的l属性,满足不同实例的差异化需求,而不是所有实例都绑定到类的同一个列表上。降低维护成本
如果后续类名需要修改(比如从Test改成MyTest),用self.l的代码不需要任何改动;而用Test.l的地方必须逐一修改,维护起来更麻烦。
内容的提问来源于stack exchange,提问作者PPIN
相关产品推荐
相关产品推荐

