在介绍新的知识之前,我们先对之前的内容做一点补充,在面向对象编程的过程中,一个对象常常被要求具备多方面的功能,从而和多个类产生联系,而这一步的实现就用到了“多继承”。多继承是指一个子类可以继承自多个父类,它可以在一定程度上增强了面向对象编程的灵活性和代码的复用性,实现了更多的功能,
多继承的语法结构如图所示,在单继承的基础上增加了更多的父类。
class People:
def career(self):
print('我是一名学生')
class Boy:
def gender(self):
print('我是一名男生')
class Student(People, Boy):
def information(self):
People.career(self)
Boy.gender(self)
print('这是我的自我介绍')
Student().information()
我是一名学生
我是一名男生
这是我的自我介绍
需要注意的是,在多继承中如果多个父类具有同名方法,而在子类调用时又未指定具体父类,会在括号中按照从左到右的顺序查找父类中是否包含方法,并调用查找到的第一个方法。
class People:
def introduce(self):
print('我是一名学生')
class Boy:
def introduce(self):
print('我是一名男生')
class Student(People, Boy):
pass
Student().introduce()
我是一名学生
补充完多继承的知识后,我们进入今天的正题——运算符重载。虽然运算符重载和我们前面所学过的方法重写都是对原有代码重定义来提高效率,但是两者有着以下区别:
- 概念:运算符重载:运算符重载指的是在编程语言中,对于自定义类型的对象,可以重定义运算符的行为。通过重载运算符,可以使对象能够像内置类型一样进行运算和操作。方法重写:方法重写指的是在面向对象编程中,子类重新定义了父类中已经存在的方法。子类可以通过方法重写来修改继承自父类的方法的行为。
- 实现方式:运算符重载:运算符重载是通过在自定义类型中定义对应的运算符函数来实现的。运算符函数使用特定的语法和命名规则,用于定义运算符与自定义类型的操作行为。方法重写:方法重写是通过在子类中重新定义与父类中同名的方法来实现的。子类中的重写方法需要与父类中的方法具有相同的名称和签名。
- 适用对象:运算符重载:运算符重载适用于自定义类型的对象,可以定义它们之间的运算和操作行为。常见的例子包括向量、矩阵、复数等可以进行数学运算的类型。方法重写:方法重写适用于类和继承关系中的对象。子类可以重写父类中已经存在的方法,以改变方法的行为。常见的例子是父类定义了一个通用的方法,子类可以根据自身的特殊需求来重写该方法。
- 作用:运算符重载:运算符重载可以提高代码的可读性和简洁性,使自定义类型的对象能够像内置类型一样进行运算和操作,增强对象之间的交互和模块化。方法重写:方法重写可以实现多态性,即同一个方法名在不同的子类中可以有不同的实现。方法重写使继承关系中的对象能够根据具体的类型选择合适的行为。
运算符重载需要在类中构建运算符方法,语法结构和示例如下:
关键字 | 运算方式 |
__cmp__ | 比较运算 |
__add__ | 加运算 |
__sub__ | 减运算 |
__mul__ | 乘运算 |
__truediv__ | 除运算 |
__mod__ | 求余运算 |
__pow__ | 乘方运算 |
class Chongzai:
def __init__(self, x1, x2, x3, x4):
self.x1 = x1
self.x2 = x2
self.x3 = x3
self.x4 = x4
def __mul__(self, other):
return Chongzai(self.x1 * other.x1, self.x2 * other.x2, self.x3 * other.x3, self.x4 * other.x4)
def __str__(self):
return 'Chongzai '+str(self.x1 + self.x2 + self.x3 + self.x4)
C1 = Chongzai(2, 3, 4, 5)
C2 = Chongzai(1, 3, 5, 7)
print(C1 * C2)
Chongzai 66
要注意重载运算符函数的返回值个数要和实例对象传入的参数个数相对应,另外我们还需要一个__str__方法来整理返回值的格式。
在pycharm中会显示这样的图标,细心的朋友会发现——这个不是和重写的图标一样吗,实际上这是__str__方法带来的结果,我们点击图标就可以跳转到object类中了。
可以看到这个类定义了许多我们常见的函数方法,像文档方法__doc__、初始化方法__init__等,这些方法通过重写可以配合运算符重载发挥出更好的效果,运算符重载和方法重写这两种手段虽有区别,但是在使用过程中相辅相成,为面向对象编程提供了更多便利。
今天的内容就到这里,感谢观看,欢迎大家批评指正。