乐于分享
好东西不私藏

Python 面向对象习题之2/10

Python 面向对象习题之2/10

本文首发于微信公众号「拙见python」,基础板块第 5 篇。
适合人群:已阅读第 2 篇:Python 面向对象编程并动手敲过代码的读者。


做题须知

  • 每道题标注了考察知识点难度星级
  • 先自己写,写不出来再看答案
  • 答案不是唯一的,能跑通且逻辑正确就行
  • 每道题答案下方附有思路解析

第 2 题:实例计数器 ⭐⭐

考察知识点:类属性 vs 实例属性、init、类方法

定义一个 Counter 类:

  1. 类属性total 记录总共创建了多少个实例
  2. 每次创建实例时 total 自动 +1
  3. 类方法get_total() 返回当前实例总数
  4. 每个实例有自己的 name 属性

创建 3 个实例并验证 total 的值。

参考答案

class Counter:    total = 0 # 类属性:所有实例共享     def __init__(self, name):        self.name = name # 实例属性:每个实例独有        Counter.total += 1 # 修改类属性,用类名访问     @classmethod    def get_total(cls):        return cls.total # 测试print(f”创建前总数:{Counter.get_total()}”) # 0 c1 = 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(),效果相同。

建议的练习方式

  1. 先自己写——不看答案,能写多少写多少

  2. 卡住了回看文章——第 2 篇对应章节有完整示例

关注「拙见python」,一起写干净的代码。

下一篇预告:Python 面向对象习题之3/10