题目重点:说明self是命名约定而非保留关键字,区分实例、classmethod和staticmethod参数绑定。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 讨论普通Python实例方法,不自定义描述符或动态属性拦截。
解题路线
- self是实例方法首参数的惯用名称,并非保留关键字。obj.method(...)访问绑定方法后会自动把obj传作第一个参数,Class.method(obj,...)则显式传入。
- 方法通过self字段读取和更新该实例状态;若字段误写成类级共享可变列表,多个实例会共享它,测试可能交叉污染。实例初始化应为每对象建立需要独占的状态。
- classmethod绑定类cls,适合替代构造器或类级策略;staticmethod不自动绑定实例或类,适合放在类命名空间的无状态工具。选择依据依赖关系,不是仅少写参数。
- Python方法绑定依赖描述符机制,普通函数放进类字典会形成绑定方法;动态覆盖、装饰器或可调用对象可能影响绑定行为,基础题先讲正常路径。
- 省略self参数会在调用时出现参数数量/类型问题;但改名this依然有效,只是不合惯例并降低可读性。不能说必须拼写为self程序才运行。
- 测试应创建两个实例验证状态隔离,并分别比较绑定调用与显式类调用;类方法对子类调用时cls应是该子类,避免工厂硬编码父类。
手动走一遍
Counter.increment(this)中this.value加1,c.increment()与Counter.increment(c)作用同一个实例,连续结果1、2;参数名改成this不改变绑定语义。
规模与取舍
绑定和字段操作在常见实现为小常量开销;共享状态同步、工厂分配与业务方法成本另计。
易错点与追问
容易失分的边界
- self说成语言关键字。
- 类属性可变列表当实例私有字段。
- classmethod硬编码父类导致子类工厂失效。
继续深挖
- classmethod工厂如何保留子类类型?
- staticmethod何时应移成模块函数?
- 自定义描述符怎样影响绑定?
技术参考
- Python Data Model:技术语义参考,具体题目按本文约定。
