Python面向对象编程基础_类继承封装与多态实践

继承实现代码复用与功能扩展,子类通过 class Child(Parent) 继承并可重写方法或用 super() 调用父类;封装通过 、_ 约定和 property 控制访问;多态依赖鸭子类型,同一接口不同实现。

类继承:复用代码与扩展功能

继承让子类自动获得父类的属性和方法,是代码复用的核心机制。定义子类时在括号中写上父类名即可,比如 class Dog(Animal): 表示 Dog 继承自 Animal。子类可以重写父类方法(如重写 make_sound() 让不同动物发出不同声音),也可以用 super().method_name() 调用父类实现。注意:Python 支持多继承,但应谨慎使用,避免方法解析顺序(MRO)带来的歧义。

封装:控制访问与隐藏实现细节

封装通过访问权限管理保护对象内部状态。Python 没有 strict 的 private 关键字,但约定用单下划线 _name 表示“受保护”,双下划线 __age 触发名称改写(name mangling),使其不易被外部直接访问。实际开发中更推荐用 property 装饰器定义属性的 getter 和 setter,既能校验输入(如年龄不能为负),又保持调用语法简洁:

  • @property 把方法变成只读属性
  • @attr_name.setter 控制赋值逻辑
  • 避免直接暴露底层数据结构

多态:同一接口,多种行为

多态体现为“不同类的对象调用相同方法,产生不同结果”。它不依赖继承关系强制绑定,而依赖“鸭子类型”——只要对象有对应方法,就能传入函数处理。例如函数 def speak(animal): animal.make_sound() 可接受 Dog、Cat 或 Bird 实例,无需检查类型。实现多态的关键是:父类定义通用接口(可为空实现或抛出 NotImplementedError),子类各自实现;调用方只依赖接口,不关心具体类型。

Deep Search

智能文献、网页检索与分析工具。AI赋能,洞悉万象,让知识检索与总结触手可及

实践建议:从简单开始,逐步加深

初学时先写一个基类(如 Shape),再派生 Circle 和 Rectangle,分别实现 area() 方法。运行时用列表存多个形状对象,遍历调用 area(),直观感受多态效果。调试时用 isinstance(obj, Class)hasattr(obj, 'method') 辅助判断,但生产代码中应尽量减少类型检查,信任接口契约。封装和继承配合使用,能让类结构清晰、职责分明,也便于后期维护和单元测试。

相关推荐:

PyAutoGUI 中 locateAllOnScreen 异常捕获的正确实践

locateAllOnScreen在未找到图像时会抛出pyscreeze.ImageNotFoundException,而直接exceptImageNotFoundException:无法捕获——必须显式导入并指定完整异常路径,否则异常将中断程序。本文详解标准捕获方式、安全遍历策略及实用规避技巧。 ...

Python子类如何调用父类方法_详解super函数在多重继承中的应用

super()是Python多重继承中确保MRO正确执行的必需机制,所有参与类必须统一使用,否则链式调用会静默中断;其三种写法各适配不同上下文,而显式父类调用仅适用于绕过MRO的特定场景。 super()是Python中调用父类方法的推荐方式,尤其在多重继承场景下,它能避免重复调用、保证方法解析顺序...

Python类中正确实现列表随机打乱的实践指南

在Python类初始化时直接对传入列表调用random.shuffle()会导致多个实例共享同一份被修改的数据,根本原因是未创建独立副本;解决方法是使用.copy()或list()构造新列表后再打乱。 在python类初始化时直接对传入列表调用`random.shuffle()`会导致多个实例共享同...

Python 如何在不安装 Celery 的情况下直接使用轻量级 Pika 封装 RabbitMQ 工具类?

直接用pika封装而非Celery,因后者抽象过深、依赖繁重;pika更轻量可控,但需自行实现连接池、重连、消息确认等关键逻辑。 为什么不用Celery而直接用pika封装? 因为Celery的抽象层会掩盖连接管理、重试逻辑和消息确认细节,而你只需要发几条任务、或做简单异步通知,又不想引入celer...