09cls关键字在类中的作用是什么,必须写吗?
文章目录
问题: cls 关键字在类中的作用是什么,必须写吗?
👇 点击展开/折叠 面试背诵模板(建议先背这个)
类方法 vs 静态方法:继承多态的关键差异
在继承体系中,类方法的 cls 参数会自动绑定到调用者(子类或父类),而静态方法完全无视调用者的类型。这是面试中区分两者的核心考点:当子类调用父类的类方法时,cls 指向子类;若用硬编码类名,则永远指向父类,导致工厂方法失效。
1 | class Parent: |
cls() 与硬编码类名的本质区别
在类方法内部,cls() 调用由解释器动态解析,其具体指向取决于调用时传入的第一个参数(自动传入)。硬编码类名则在函数定义阶段就已绑定,无法被继承重写。因此,设计可扩展的工厂方法时,必须使用 cls() 而非固定类名。
在类方法中修改类属性的正确方式
类方法通过 cls.attr 修改类属性,效果与 ClassName.attr 完全一致,但 cls 在继承中具有更好的扩展性。若在子类中未重写该属性,修改会直接影响父类及所有其他子类;若子类重写了该属性,修改仅影响该子类及其后续子类。
1 | class A: |
常见误区:通过实例调用类方法时 cls 指向谁?
类方法可通过实例调用(如 obj.class_method()),但 cls 传入的依然是该实例所属的类,而非实例对象。这意味着在类方法内部无法访问 self,若误用 self 会引发 NameError。此设计强调类方法与实例状态无关,仅与类状态绑定。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LGQ的博客!