# 第 3-1 课课堂练习:Python 与 Java 的类和对象 # # 这份练习把关键差异直接写进题目,不要求先完整阅读讲义。 # 请先独立完成;不要删除题目、预期输出和自查说明。 # 第一部分:定义 Book 类 # 1. 不要像 Java 一样预先声明 title、author、price 字段。 # 2. 定义 __init__(self, title, author, price=0.0) 方法。 # 3. 为 title 和 author 添加 str 类型注解,为 price 添加 float 类型注解。 # 4. 返回值标注为 None。 # 5. 在 __init__ 中通过 self.title、self.author、self.price 创建实例属性。 # # Java 对照提醒: # - Python 的 __init__ 承担初始化职责,但不是“与类同名的构造器”; # - self 类似 Java 的 this,但必须写在方法参数列表中; # - 创建对象时不写 new,也不手动传入 self。 # 第二部分:定义实例方法 get_summary(self) # 1. 返回值标注为 str。 # 2. 返回格式:书名:《Python 后端开发》|作者:小明|价格:59.0 元。 # 3. 必须通过 self 读取三个实例属性。 # # Java 对照提醒: # - Python 方法没有 public 关键字; # - 调用时写 book.get_summary(),Python 会自动把 book 传给 self。 # 第三部分:添加类属性 category # 1. 在 Book 类中、所有方法外定义 category = "编程"。 # 2. 在后面的 main() 中分别使用 Book.category 和 book.category 输出它。 # # Java 对照提醒: # - 类属性在用途上类似 Java 的 static 字段; # - 为避免实例属性遮蔽类属性,本题不要执行 book.category = ...。 # 第四部分:定义类方法 from_text(cls, text) # 1. 在方法上方添加 @classmethod。 # 2. text 的格式固定为“书名|作者”,例如“流畅的 Python|Luciano”。 # 3. 使用 text.split("|") 得到书名和作者。 # 4. 使用 cls(title, author) 创建并返回对象,让 price 使用默认值。 # # Java 对照提醒: # - cls 指向当前类,classmethod 常用于实现命名工厂; # - 不要把类名 Book 写死在 return 中,使用 cls 更利于继承。 # 第五部分:定义静态方法 is_valid_price(price) # 1. 在方法上方添加 @staticmethod。 # 2. price 标注为 float,返回值标注为 bool。 # 3. price 大于或等于 0 时返回 True,否则返回 False。 # # Java 对照提醒: # - staticmethod 不接收 self 或 cls; # - 当逻辑与 Book 有关、但不需要对象状态和类状态时,可以使用它。 # 第六部分:定义 main() 并完成运行验证 # 1. 使用 Book("Python 后端开发", "小明", 59.0) 创建 book,注意不写 new。 # 2. 输出 book.get_summary()。 # 3. 分别通过类和对象输出 category。 # 4. 使用 Book.from_text("流畅的 Python|Luciano") 创建 imported_book。 # 5. 输出 imported_book.get_summary(),其价格应为默认值 0.0。 # 6. 输出 Book.is_valid_price(59.0) 和 Book.is_valid_price(-1.0)。 # 7. 添加程序入口判断,直接运行本文件时调用 main()。 # # 预期输出: # 书名:《Python 后端开发》|作者:小明|价格:59.0 元 # 通过类读取分类:编程 # 通过对象读取分类:编程 # 书名:《流畅的 Python》|作者:Luciano|价格:0.0 元 # 59.0 是合法价格:True # -1.0 是合法价格:False # 完成后自查: # 1. 是否能解释 self 与 Java this 的相同点和写法差异; # 2. 是否记住 Python 创建对象时不写 new; # 3. 是否知道 __init__ 负责初始化,而不是 Java 式的同名构造器; # 4. 是否能区分实例属性、类属性、实例方法、类方法和静态方法; # 5. 是否没有在类外直接替学习者写出答案。