当前位置: 首页 > news >正文

Python-封装、继承与重写

文章目录

    • 一、私有和公有(属性与方法)
      • 1. 公有成员(默认)
      • 2. 私有成员
    • 二、继承
      • 1. 基本语法
      • 2. 继承特性
      • 3. 初始化父类成员
    • 三、重写(覆盖与扩展)
      • 1. 覆盖(Override)
      • 2. 扩展(Extend)
      • 3. 注意事项
    • 总结


一、私有和公有(属性与方法)

Python 通过命名规范实现封装(区分私有/公有成员),控制成员的访问权限。

1. 公有成员(默认)

  • 定义:直接以字母开头(不含下划线或仅含单下划线开头)
  • 访问:类内部、类外部、子类中均可直接访问
class Person:def __init__(self, name):self.name = name  # 公有属性self._age = 18    # 单下划线开头(约定为"半私有",不建议外部直接访问)def say_hello(self):  # 公有方法print(f"Hello, I'm {self.name}")# 外部访问
p = Person("Alice")
print(p.name)      # 允许:直接访问公有属性
p.say_hello()      # 允许:直接调用公有方法
print(p._age)      # 语法允许(但不符合约定,不推荐)

2. 私有成员

  • 定义:以双下划线 __ 开头(不含双下划线结尾,避免与特殊方法冲突)
  • 原理:Python 会对私有成员进行名称修饰(在名称前加 _类名),限制外部直接访问
  • 访问:仅允许在类内部直接访问,外部/子类需通过特殊方式(不推荐)或公有方法间接访问
class Person:def __init__(self, id_card):self.__id = id_card  # 私有属性def __check_id(self):    # 私有方法return len(self.__id) == 18def get_id_validity(self):  # 公有方法间接访问私有成员return self.__check_id()# 外部访问测试
p = Person("110101199001011234")
# print(p.__id)        # 报错:AttributeError(无法直接访问)
# p.__check_id()      # 报错:AttributeError(无法直接调用)# 特殊方式访问(不推荐!破坏封装性)
print(p._Person__id)  # 输出:110101199001011234(名称修饰后的实际名称)# 推荐方式:通过公有方法访问
print(p.get_id_validity())  # 输出:True

二、继承

继承是代码复用的核心机制,允许子类(派生类)继承父类(基类)的属性和方法,并可扩展新功能。

1. 基本语法

class 父类名:# 父类成员...class 子类名(父类名):  # 通过括号指定父类# 子类成员...

2. 继承特性

  • 子类自动拥有父类的公有成员(私有成员无法直接继承)
  • 子类可定义自己的新成员(属性/方法)
  • 支持多层继承(子类 → 父类 → 祖父类…)
# 父类
class Animal:def __init__(self, name):self.name = name  # 公有属性def eat(self):        # 公有方法print(f"{self.name} is eating")# 子类(继承自Animal)
class Dog(Animal):# 子类新增方法def bark(self):print(f"{self.name} is barking: Woof!")# 使用子类
dog = Dog("Buddy")
dog.eat()   # 继承父类方法:Buddy is eating
dog.bark()  # 子类自有方法:Buddy is barking: Woof!

3. 初始化父类成员

子类构造方法中需显式调用父类构造方法,否则父类属性无法初始化。

class Animal:def __init__(self, name):self.name = nameclass Cat(Animal):def __init__(self, name, color):# 调用父类构造方法(两种方式)super().__init__(name)  # 推荐:适用于多层继承# Animal.__init__(self, name)  # 仅适用于单继承self.color = color  # 子类新增属性cat = Cat("Mimi", "white")
print(cat.name)  # 输出:Mimi(父类属性)
print(cat.color) # 输出:white(子类属性)

三、重写(覆盖与扩展)

子类可对父类的方法进行重写,实现与父类不同的功能。

1. 覆盖(Override)

子类定义与父类同名、同参数的方法,完全替代父类方法。

class Animal:def make_sound(self):print("Some sound")class Duck(Animal):# 覆盖父类方法def make_sound(self):print("Quack! Quack!")animal = Animal()
animal.make_sound()  # 输出:Some soundduck = Duck()
duck.make_sound()    # 输出:Quack! Quack!(调用子类重写的方法)

2. 扩展(Extend)

子类重写方法时,先调用父类方法的功能,再添加新功能(通过 super() 实现)。

class Animal:def introduce(self):print("I am an animal")class Rabbit(Animal):# 扩展父类方法def introduce(self):super().introduce()  # 先执行父类方法print("I have long ears")  # 新增功能rabbit = Rabbit()
rabbit.introduce()
# 输出:
# I am an animal
# I have long ears

3. 注意事项

  • 重写方法的参数列表应与父类保持一致(或兼容)
  • 私有方法无法被重写(子类可定义同名方法,但不属于重写)
  • 可通过 super().父类方法名() 在子类中调用父类被重写的方法

总结

  1. 封装:通过 __ 定义私有成员(仅类内访问),默认成员为公有(类内外均可访问)
  2. 继承:子类通过 class 子类(父类) 继承父类,需用 super() 初始化父类成员
  3. 重写
    • 覆盖:子类方法完全替代父类同名方法
    • 扩展:子类方法通过 super() 调用父类方法后添加新功能

这些特性是 Python 面向对象编程的核心,合理使用可提高代码复用性和可维护性。

http://www.dtcms.com/a/516295.html

相关文章:

  • 新媒体培训班学费多少做网站和优化
  • 网站开发案例pdf工程造价信息价在什么网站查
  • Prometheus(一)—— Prometheus监控系统从入门到实战:理论与部署全指南
  • 使用宝塔面板docker部署https://github.com/imsyy/DailyHotApi项目
  • RHCE作业2
  • 乐云网站建设网站源码分享网
  • 发展历程 网站建设专业提供网站建设服务是什么
  • Katalon Studio AI生成API测试
  • ip生产区
  • 做网站需要了解哪些知识wordpress文章增加字段
  • 要制作一个自己的网站wordpress实时推送 php
  • AWS DMS 任务优化实战:解决 Aurora MySQL 到 Redshift 的数据一致性与性能问题
  • 电感、电容与电抗的标幺值关系详解
  • JMeter测试关系数据库: JDBC Request
  • 珠海英语翻译 欧得宝:专业译员实测 2025年
  • 硬件内部优先级
  • 高端网站建设公司哪里济南兴田德润实惠吗网架加工厂的地址
  • 美妆网站建设制作公司网站结构图
  • 【2025最新】APP开启了SSL无法被抓包,如何进行调试
  • c++算法题目总结
  • 开源安全管理平台wazuh-检测 SQL 注入攻击
  • 试用网站 建站网站建设 徐州
  • 如何屏蔽GORM个别sql的日志
  • [C++]软件接口函数测试
  • 基于 Apache POI 5.2.5 构建高效 Excel 工具类:从零到生产级实践
  • 直接插入排序详解
  • 网站界面切片做程序宁波免费建站seo排名
  • Leetcode 33
  • 济南制作网站制作公司策划采购网有哪些平台
  • conda 换盘符