首页
技术小册
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.1 重写方法 在Python编程中,面向对象编程(OOP)是一个核心概念,它允许我们通过创建类和对象来模拟现实世界中的复杂系统。在面向对象的设计中,继承是一个强大的特性,它允许我们基于已有的类(称为基类或父类)来定义新的类(称为派生类或子类)。在这个过程中,子类可以继承父类的属性和方法,同时也可以对继承来的方法进行修改或扩展,这一过程称为**重写方法**(Overriding Methods)。 #### 16.1.1.1 理解重写方法 重写方法是指在子类中定义一个与父类中同名的方法,从而覆盖(或说替换)父类中的方法实现。当通过子类的实例调用该方法时,将执行子类中的方法定义,而不是父类中的原始定义。这种机制为类的扩展和定制提供了极大的灵活性。 #### 16.1.1.2 为什么需要重写方法 - **多态性**:多态性是面向对象编程的三大特性之一,它允许我们以统一的方式处理不同类型的对象。通过重写方法,子类可以提供对父类方法的具体实现,使得同一操作在不同的对象上可以有不同的表现。 - **功能扩展**:子类在重写方法时,可以在保留父类方法功能的基础上添加新的功能或修改现有功能,以满足特定的需求。 - **行为定制**:有时候,父类的方法虽然提供了基本的框架,但可能并不完全符合子类的需求。通过重写方法,子类可以精确地控制其行为。 #### 16.1.1.3 如何实现重写方法 在Python中,实现方法重写非常简单,只需要在子类中定义一个与父类中同名的方法即可。Python解释器会自动根据对象的实际类型(即对象的类)来决定调用哪个方法。 ##### 示例:形状类与重写方法 假设我们有一个表示形状的基类`Shape`,它有一个`draw`方法用于绘制形状。现在,我们想要创建两个派生类`Circle`和`Rectangle`,分别表示圆形和矩形,并重写它们的`draw`方法来提供具体的绘制逻辑。 ```python class Shape: def draw(self): # 这是一个基本的绘制方法,通常会被子类重写 print("绘制一个基本形状") class Circle(Shape): def __init__(self, radius): self.radius = radius def draw(self): # 重写draw方法以绘制圆形 print(f"绘制一个半径为{self.radius}的圆形") class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def draw(self): # 重写draw方法以绘制矩形 print(f"绘制一个宽为{self.width}、高为{self.height}的矩形") # 使用示例 circle = Circle(5) circle.draw() # 输出: 绘制一个半径为5的圆形 rectangle = Rectangle(4, 6) rectangle.draw() # 输出: 绘制一个宽为4、高为6的矩形 ``` 在上面的例子中,`Circle`和`Rectangle`类都重写了从`Shape`类继承来的`draw`方法,以提供各自的绘制逻辑。当调用这些对象的`draw`方法时,Python会根据对象的实际类型(`Circle`或`Rectangle`)来调用相应的方法实现。 #### 16.1.1.4 重写方法的注意事项 - **签名一致性**:虽然Python在方法重写时不要求方法签名(即参数列表)完全一致,但出于可读性和一致性的考虑,通常建议子类中的重写方法保持与父类方法相同的签名。如果确实需要改变参数列表,应当仔细考虑这样做是否合适,并在文档中明确说明。 - **`super()`函数的使用**:在子类的方法中,有时需要调用父类的同名方法。这时,可以使用`super()`函数来引用父类,并调用其方法。`super()`函数返回了一个代表父类的临时对象,允许我们调用父类中的方法。 - **避免无限递归**:在重写方法时,如果不小心在子类的方法中调用了自己(而不是父类的方法),可能会导致无限递归,最终引发栈溢出错误。务必确保在需要时正确调用父类的方法。 - **访问修饰符**:虽然Python没有像Java或C++那样的显式访问修饰符(如`public`、`protected`、`private`),但通常约定以单下划线开头的属性或方法被视为受保护的(即不应在类外部直接访问),双下划线开头的为私有(Python通过名称改写机制实现私有性)。在重写方法时,应尊重这些约定,避免直接访问或修改父类的私有属性。 #### 16.1.1.5 总结 重写方法是面向对象编程中一项非常重要的特性,它允许子类对继承自父类的方法进行定制和扩展。通过重写方法,我们可以实现多态性、功能扩展和行为定制等目的。在Python中,实现方法重写非常简单直观,但需要注意签名一致性、`super()`函数的使用、避免无限递归以及尊重访问修饰符的约定等问题。掌握方法重写技术,将使我们能够更加灵活和有效地利用面向对象编程的优势来设计和实现复杂的软件系统。
上一篇:
16.1 继承的原理
下一篇:
16.1.2 super()函数
该分类下的相关小册推荐:
Python合辑6-字典专题
Python机器学习基础教程(上)
Python面试指南
实战Python网络爬虫
Python合辑12-面向对象
Python合辑9-判断和循环
Python合辑8-变量和运算符
Python编程轻松进阶(二)
Python高性能编程与实战
Python机器学习基础教程(下)
Python合辑10-函数
Python编程轻松进阶(四)