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().父类方法名()
在子类中调用父类被重写的方法
总结
- 封装:通过
__
定义私有成员(仅类内访问),默认成员为公有(类内外均可访问) - 继承:子类通过
class 子类(父类)
继承父类,需用super()
初始化父类成员 - 重写:
- 覆盖:子类方法完全替代父类同名方法
- 扩展:子类方法通过
super()
调用父类方法后添加新功能
这些特性是 Python 面向对象编程的核心,合理使用可提高代码复用性和可维护性。