Python面向对象编程
六、封装与属性控制
-
访问权限标识
命名方式 含义 示例 单下划线开头 _x
约定私有属性(外部仍可访问) self._salary
双下划线开头 __x
名称修饰(伪私有化) self.__password
首尾双下划线 __x__
系统定义特殊属性/方法 __init__
-
@property装饰器
class Person: def __init__(self, name): self._name = name # 保护属性 @property def name(self): # 获取器 return self._name @name.setter def name(self, value): # 设置器 if len(value) < 2: raise ValueError("姓名至少2个字符") self._name = value p = Person("Alice") print(p.name) # 像访问属性一样调用getter p.name = "Bob" # 像赋值一样调用setter
七、继承进阶
-
继承语法与特性
class Animal: # 父类 def __init__(self, name): self.name = name def speak(self): raise NotImplementedError("子类必须实现此方法") class Dog(Animal): # 单继承 def speak(self): # 方法重写 return "汪汪!" class Cat(Animal): def speak(self): return "喵~"
-
多继承与MRO
class A: def show(self): print("A") class B(A): def show(self): print("B") class C(A): def show(self): print("C") class D(B, C): # 多继承 pass print(D.mro()) # 方法解析顺序:D -> B -> C -> A -> object d = D() d.show() # 输出 B
-
super()使用技巧
class Father: def __init__(self, name): self.name = name print("Father初始化完成") class Son(Father): def __init__(self, name, age): super().__init__(name) # 调用父类初始化 self.age = age print("Son初始化完成")
八、Python多态特性
-
核心特点
• 鸭子类型:不检查对象类型,只关心是否具有对应方法
• 无需继承关系:只要对象实现了相同方法名即可 -
典型示例
class PDFReader: def read(self): print("解析PDF内容") class TextReader: def read(self): print("读取文本内容") class ImageReader: def read(self): print("解码图像数据") def process_file(reader): # 接收任何有read()方法的对象 reader.read() # 不同类型对象均可处理 process_file(PDFReader()) # 解析PDF内容 process_file(TextReader()) # 读取文本内容 process_file(ImageReader()) # 解码图像数据
概念对比表
特性 | Java实现方式 | Python实现方式 |
---|---|---|
封装 | private关键字 | 命名约定 + property装饰器 |
继承 | 单继承+接口 | 多继承 + mixin模式 |
多态 | 基于继承的类型系统 | 基于鸭子类型的动态多态 |
方法重写 | @Override注解 | 直接重写同名方法 |
父类方法调用 | super关键字 | super()函数 |
学习建议
- 练习使用@property实现数据验证
- 尝试构建3层继承体系(爷爷类->父类->子类)
- 用多继承实现一个实际场景(如会飞+会游泳的动物)
- 编写需要动态判断对象能力的函数,体会鸭子类型
- 研究
__mro__
属性的实际应用场景