
本文首发于微信公众号「拙见python」,基础板块第 5 篇。
适合人群:已阅读第 2 篇:Python 面向对象编程并动手敲过代码的读者。
做题须知
每道题标注了考察知识点和难度星级 先自己写,写不出来再看答案 答案不是唯一的,能跑通且逻辑正确就行 每道题答案下方附有思路解析
第 2 题:实例计数器 ⭐⭐
考察知识点:类属性 vs 实例属性、init、类方法
定义一个
Counter类:
用类属性 total记录总共创建了多少个实例每次创建实例时 total自动 +1用类方法 get_total()返回当前实例总数每个实例有自己的 name属性创建 3 个实例并验证
total的值。
参考答案:
class Counter:total = 0# 类属性:所有实例共享def __init__(self, name):self.name = name# 实例属性:每个实例独有Counter.total += 1# 修改类属性,用类名访问@classmethoddef get_total(cls):return cls.total# 测试print(f”创建前总数:{Counter.get_total()}”)# 0c1 = Counter(”计数器A”)c2 = Counter(”计数器B”)c3 = Counter(”计数器C”)print(f”创建后总数:{Counter.get_total()}”)# 3print(f”各实例名称:{c1.name}, {c2.name}, {c3.name}”)# 各实例名称:计数器A, 计数器B, 计数器C
思路解析:
total = 0定义在类体中,是类属性,所有实例共享同一份。
在__init__中用 Counter.total += 1修改类属性——必须用类名(Counter.total),如果写成 self.total += 1 会创建一个同名的实例属性遮蔽类属性,导致计数失败。
@classmethod 的第一个参数cls是类本身,通过 cls.total 访问类属性。
类方法可以通过类名调用 Counter.get_total(),也可以通过实例调用 c1.get_total(),效果相同。
建议的练习方式:
先自己写——不看答案,能写多少写多少
卡住了回看文章——第 2 篇对应章节有完整示例
下一篇预告:Python 面向对象习题之3/10
夜雨聆风