首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 13章 性能测量和大O算法分析
13.1 timeit模块
13.2 cProfile分析器
13.3 大O算法分析
13.4 大O阶
13.4.1 使用书架打比方描述大O阶
13.4.2 大O 测量的是最坏情况
13.5 确定代码的大O 阶
13.5.1 为什么低阶项和系数不重要
13.5.2 大O 分析实例
13.5.3 常见函数调用的大O 阶
13.5.4 一眼看出大O 阶
13.5.5 当n 很小时,大O并不重要,而n通常都很小
第 14章 项目实战
14.1 汉诺塔
14.1.1 汉诺塔输出
14.1.2 汉诺塔源代码
14.1.3 汉诺塔编写代码
14.2 四子棋
14.2.1 四子棋输出
14.2.2 四子棋源代码
14.2.3 四子棋编写代码
第 15章 面向对象编程和类
15.1 拿现实世界打比方:填写表格
15.2 基于类创建对象
15.3 创建一个简单的类——WizCoin
15.3.1 方法__init__()和self
15.3.2 特性
15.3.3 私有特性和私有方法
15.4 函数type()和特性__qualname__
15.5 非OOP 和OOP 的例子:井字棋
15.6 为现实世界设计类是一件难事儿
第 16章 面向对象编程和继承
16.1 继承的原理
16.1.1 重写方法
16.1.2 super()函数
16.1.3 倾向于组合而非继承
16.1.4 继承的缺点
16.2 函数isinstance()和issubclass()
16.3 类方法
16.4 类特性
16.5 静态方法
16.6 何时应该使用类和静态的面向对象特性
16.7 面向对象的行话
16.7.1 封装
16.7.2 多态性
16.8 何时不应该使用继承
16.9 多重继承
16.10 方法解析顺序
第 17章 Python 风格的面向对象编程:属性和魔术方法
17.1 属性
17.1.1 将特性转换为属性
17.1.2 使用setter 验证数据
17.1.3 只读属性
17.1.4 什么时候应该使用属性
17.2 Python 的魔术方法
17.2.1 字符串表示魔术方法
17.2.2 数值魔术方法
17.2.3 反射数值魔术方法
17.2.4 原地魔术方法
17.2.5 比较魔术方法
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(五)
小册名称:Python编程轻松进阶(五)
### 16.1 继承的原理 在Python编程的广阔领域中,继承是一个核心概念,它允许我们定义类之间的层次结构,使得代码更加模块化、易于管理和复用。通过继承,一个类(子类或派生类)可以继承另一个类(基类或父类)的属性和方法,同时还可以在此基础上添加新的属性或重写(override)已有方法。这一机制极大地促进了面向对象编程(OOP)的灵活性和可扩展性。本章将深入探讨Python中继承的原理,包括其基本概念、单继承与多继承、方法重写、属性查找顺序(MRO)以及继承中的特殊方法。 #### 16.1.1 继承的基本概念 在Python中,继承是通过定义一个类时指定另一个类作为其父类(基类)来实现的。子类会继承父类的所有公共和受保护的成员(属性和方法),但不会继承私有成员(以双下划线开头的属性和方法,它们被视为类的内部实现细节)。这种机制允许我们创建出具有共同特征但又各具特色的类体系。 ```python class Animal: def __init__(self, name): self.name = name def speak(self): raise NotImplementedError("Subclass must implement abstract method") class Dog(Animal): def speak(self): return f"{self.name} says Woof!" # 示例使用 dog = Dog("Buddy") print(dog.speak()) # Buddy says Woof! ``` 在上述示例中,`Dog`类继承了`Animal`类,并重写了`speak`方法以提供特定于狗的行为。 #### 16.1.2 单继承与多继承 Python支持单继承和多继承。单继承意味着一个子类只能有一个直接父类;而多继承则允许一个子类有多个直接父类。多继承虽然提供了更大的灵活性,但也带来了“菱形问题”(Diamond Problem)等复杂性和潜在的歧义性。 **单继承示例**: ```python class Vehicle: def move(self): print("Vehicle is moving") class Car(Vehicle): def move(self): super().move() # 调用父类方法 print("Car is moving faster") # 示例使用 car = Car() car.move() # 输出:Vehicle is moving 和 Car is moving faster ``` **多继承示例**: ```python class ParentA: def method_a(self): print("Method A from ParentA") class ParentB: def method_b(self): print("Method B from ParentB") class Child(ParentA, ParentB): pass # 示例使用 child = Child() child.method_a() # 调用ParentA的方法 # 注意:如果ParentA和ParentB有同名方法,且Child未重写,则调用顺序由MRO决定 ``` #### 16.1.3 方法重写与super()函数 方法重写(也称为方法覆盖)是子类提供特定于自己的实现来替换继承自父类的方法的行为。这是多态性的一个体现。在重写方法时,经常需要调用父类中被重写的方法,这时可以使用`super()`函数。`super()`函数返回了一个代表父类的临时对象,允许你调用父类的方法。 ```python class Parent: def __init__(self): self.value = 1 print("Parent __init__") def show(self): print("Parent show") class Child(Parent): def __init__(self): super().__init__() # 调用父类的__init__ self.value = 2 print("Child __init__") def show(self): super().show() # 调用父类的show print("Child show") # 示例使用 child = Child() child.show() # 输出:Parent __init__、Child __init__、Parent show、Child show ``` #### 16.1.4 属性查找顺序(MRO) 在Python中,多继承时属性的查找顺序由方法解析顺序(Method Resolution Order, MRO)决定。Python 3使用C3线性化算法来计算MRO,以确保每个基类只被访问一次,且基类被访问的顺序是单调递增的。这有助于解决多继承中的菱形问题。 ```python class A: pass class B(A): pass class C(A): pass class D(B, C): pass print(D.__mro__) # 输出D的MRO列表,通常包括(D, B, C, A, object) ``` #### 16.1.5 继承中的特殊方法 在Python的继承体系中,有几个特殊的方法(也称为魔法方法或双下划线方法)在继承过程中扮演着重要角色,如`__init__`(构造函数)、`__new__`(实例化时调用的静态方法,用于创建并返回实例对象)、`__call__`(使得类的实例可以像函数那样被调用)等。此外,`super()`的使用也依赖于`__mro__`属性来确定方法调用的顺序。 - **`__init__`**:构造函数,用于初始化新创建的对象。 - **`__new__`**:静态方法,用于实例化对象;在`__init__`之前被调用。 - **`__call__`**:允许类的实例像函数那样被调用。 继承是Python面向对象编程的基石之一,它不仅简化了代码结构,还促进了代码的复用和扩展。通过深入理解继承的原理,包括基本概念、单继承与多继承、方法重写、属性查找顺序(MRO)以及特殊方法,我们可以更加灵活地运用Python的OOP特性,编写出更加高效、可维护的代码。
上一篇:
第 16章 面向对象编程和继承
下一篇:
16.1.1 重写方法
该分类下的相关小册推荐:
Python爬虫入门与实战开发(下)
Python编程轻松进阶(三)
Python编程轻松进阶(四)
Python与办公-玩转Excel
机器学习算法原理与实战
Python合辑14-面向对象编程案例(下)
Python合辑8-变量和运算符
Python机器学习基础教程(上)
Python合辑5-格式化字符串
Python自动化办公实战
剑指Python(万变不离其宗)
Python合辑13-面向对象编程案例(上)