1. 继承介绍
在面向对象编程中,继承是面向对象三大特征之一。继承允许我们定义一个类,这个类继承了另一个类的属性和方法,从而减少了代码的重复,同时也遵循了软件开发的DRY(Don't Repeat Yourself)原则,使代码更具可读性、可维护性和扩展性。
Python中的继承机制非常灵活,它支持多继承、方法重写和超继承调用。
2. 单继承
2.1 简单的继承示例
在Python中,可以通过继承父类来创建子类,并重载父类的方法或者添加新的方法,下面我们来看一个简单的示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print('My name is {}, and I am {} years old.'.format(self.name, self.age))
class Student(Person):
def __init__(self, name, age, school):
super().__init__(name, age)
self.school = school
def study(self):
print('{} is studying in {}.'.format(self.name, self.school))
这里我们创建了一个Person类,包含了姓名和年龄两个属性以及一个introduce()方法,用于输出姓名和年龄信息。然后我们又创建了一个Student类,它从Person类继承了姓名和年龄两个属性以及introduce()方法,并添加了一个新的方法study(),用于输出学生学校的信息。
现在我们可以用Student类创建一个学生对象,并调用它的方法:
student = Student('Tom', 18, 'MIT')
student.introduce()
student.study()
输出结果如下:
My name is Tom, and I am 18 years old.
Tom is studying in MIT.
这个简单的示例展示了继承的基本思想,即从父类继承属性和方法,并在子类中添加新的属性和方法来实现功能的扩展。
2.2 方法重写
当子类需要对继承自父类的方法进行修改时,需要重写这个方法,下面我们来看一个方法重写的示例:
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Square(Rectangle):
def __init__(self, side):
super().__init__(side, side)
def area(self): # 重写area方法
return self.width ** 2
r = Rectangle(5, 6)
print(r.area())
s = Square(5)
print(s.area())
这里我们创建了一个Rectangle类,包含width和height两个属性以及area()方法,用于计算矩形的面积。然后我们又创建了一个Square类,它从Rectangle类继承了width和height两个属性以及area()方法,并重写了area()方法,用于计算正方形的面积。
现在我们可以用Rectangle类创建一个矩形对象,用Square类创建一个正方形对象,并分别调用它们的area()方法:
r = Rectangle(5, 6)
print(r.area()) # 30
s = Square(5)
print(s.area()) # 25
输出结果如下:
30
25
可以看到,Square类重写了Rectangle类的area()方法,并使用自己的算法实现了正方形的面积计算。
3. 多继承
在Python中,一个子类可以从多个父类继承属性和方法,这种继承方式称为多继承。下面我们来看一个多继承的示例:
class A:
def do_something(self):
print('do something in A')
class B:
def do_something(self):
print('do something in B')
class C(A, B):
def test(self):
self.do_something()
c = C()
c.test()
这里我们创建了三个类A、B、C,其中A和B是两个父类,C是一个子类,它从A和B两个父类继承了do_something()方法并重写实现了test()方法,用于在test()方法中调用do_something()方法。
现在我们可以创建一个C类的对象,并调用它的test()方法:
c = C()
c.test()
输出结果如下:
do something in A
可以看到,C类的do_something()方法的实现来自于A类而不是B类,这是由于在多继承中,按照“广度优先”的顺序搜索方法,即从左到右遍历所有父类,如果有同名方法,就使用最左边的那个父类的方法。
4. 超继承调用
当子类需要调用父类的方法时,可以使用超继承调用的方法,它使用super()函数来实现。下面我们来看一个超继承调用的示例:
class A:
def do_something(self):
print('do something in A')
class B:
def do_something(self):
print('do something in B')
class C(A, B):
def do_something(self):
super().do_something()
print('do something in C')
c = C()
c.do_something()
这里我们创建了三个类A、B、C,其中A和B是两个父类,C是一个子类,它从A和B两个父类继承了do_something()方法并重写实现了它,用于在C类中调用父类的do_something()方法并追加新的功能。
现在我们可以创建一个C类的对象,并调用它的do_something()方法:
c = C()
c.do_something()
输出结果如下:
do something in A
do something in C
可以看到,当C类的do_something()方法被调用时,它先使用super()函数调用了A类的do_something()方法,然后再输出自己的信息。
5. 总结
本文介绍了Python中的继承机制,并分别讲解了单继承、多继承、方法重写以及超继承调用的使用方法,同时也展示了继承的灵活性和优点,希望读者通过本文的学习,能够更好地理解和应用Python中的继承技术。