feat(面向对象): 完成第三阶段差异化课程
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
# 第 3-3 课完整示例:Python 与 Java 的继承和多态差异
|
||||
#
|
||||
# 示例集中演示 super()、方法重写、多继承的方法解析顺序和鸭子类型。
|
||||
|
||||
|
||||
class Notifier:
|
||||
"""所有通知器都可以复用的基础类。"""
|
||||
|
||||
def __init__(self, sender: str) -> None:
|
||||
self.sender = sender
|
||||
|
||||
def send(self, message: str) -> None:
|
||||
"""定义统一操作;具体子类负责实现发送行为。"""
|
||||
raise NotImplementedError("子类必须实现 send() 方法。")
|
||||
|
||||
|
||||
class EmailNotifier(Notifier):
|
||||
"""通过继承实现邮件通知器。"""
|
||||
|
||||
def __init__(self, sender: str, address: str) -> None:
|
||||
# Python 3 中通常直接写 super(),不需要传入类名和 self。
|
||||
super().__init__(sender)
|
||||
self.address = address
|
||||
|
||||
def send(self, message: str) -> None:
|
||||
"""重写父类方法;Python 不要求添加 @Override。"""
|
||||
print(f"邮件|{self.sender} -> {self.address}:{message}")
|
||||
|
||||
|
||||
class ConsoleNotifier:
|
||||
"""没有继承 Notifier,但同样提供 send() 方法。"""
|
||||
|
||||
def send(self, message: str) -> None:
|
||||
print(f"控制台|{message}")
|
||||
|
||||
|
||||
class LogMixin:
|
||||
"""混入类(Mixin)只提供一项可复用能力。"""
|
||||
|
||||
def record(self) -> None:
|
||||
print("通知行为已记录。")
|
||||
|
||||
|
||||
class LoggedEmailNotifier(EmailNotifier, LogMixin):
|
||||
"""Python 可以继承多个类,查找方法时遵循 MRO。"""
|
||||
|
||||
|
||||
def send_message(notifier, message: str) -> None:
|
||||
"""只要传入对象具有 send() 方法,就可以完成调用。"""
|
||||
notifier.send(message)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""运行继承和多态差异示例。"""
|
||||
email = EmailNotifier("系统", "user@example.com")
|
||||
console = ConsoleNotifier()
|
||||
|
||||
print("差异 1:子类使用 super() 复用父类逻辑,不需要写父类名称。")
|
||||
print(f"邮件发送者:{email.sender}")
|
||||
print()
|
||||
|
||||
print("差异 2:Python 重写方法时没有强制的 @Override。")
|
||||
email.send("课程开始")
|
||||
print()
|
||||
|
||||
print("差异 3:鸭子类型关注对象有什么行为,而不是声明了什么接口。")
|
||||
send_message(email, "继承得到 send()")
|
||||
send_message(console, "未继承也能调用 send()")
|
||||
print()
|
||||
|
||||
print("差异 4:Python 支持多继承,并通过 MRO 决定方法查找顺序。")
|
||||
logged_email = LoggedEmailNotifier("系统", "admin@example.com")
|
||||
logged_email.record()
|
||||
print([class_type.__name__ for class_type in LoggedEmailNotifier.mro()])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user