python中的继承和多态
Python中的继承
- 继承中的一些基础的定义
- 继承是面向对象编程的三大特性之一,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用(继承的主要目的)和扩展。
- 父类,也叫超类和基类。
- 子类,也叫派生类和继承类。
- 父类构造器:自动调用下一个父类中的构造方法
- 继承的基本语法
- 一个父类可以有多个子类,但一个子类只能有一个父类
- 没有说明继承哪个类的时候,就会自动继承object类
- 继承后可以使用父类的公共内容,但不能使用私有内容
class ParentClass:# 父类属性和方法pass
# class 子类名(父类名):
class ChildClass(ParentClass):# 子类属性和方法pass
- 方法重写(Override)和父类构造器
- 继承方法重写定义:在继承关系下改变父类已经定义的方法,从而达到使用的目的。
子类可以重写父类的方法的示例:
class Bird:def fly(self):return "鸟儿会飞"class Penguin(Bird):def fly(self):return "企鹅不会飞"penguin = Penguin()
print(penguin.fly()) # 输出: 企鹅不会飞
- 父类构造器:在多继承中的第一个父类中增加super()_ _init _ (下一个父类中的变量),子类中写super() _ init _ _ 就可以了。
- 如果是单继承的话,直接使用super()_ _ init _ _ 调用。
class Father:def __init__(self):print("Father构造器")super().__init__()class Mother:def __init__(self):print("Mother构造器")super().__init__()class Child(Father, Mother):def __init__(self):print("Child构造器开始")super().__init__()print("Child构造器结束")c = Child()
# 输出:
# Child构造器开始
# Father构造器
# Mother构造器
# Child构造器结束print(Child.__mro__) # 查看方法解析顺序,Python使用C3算法确定方法调用顺序
- 继承的类型
- 单继承:子类只继承一个父类,如果没有写明具体继承什么类时,定义的类自动继承object类(这就说明,在自己编写类程序的时候,所有的类都是object类的子类)。
class Animal:def __init__(self, name):self.name = namedef speak(self):return "动物叫声"class Dog(Animal):def speak(self):return "汪汪!"dog = Dog("阿黄")
print(dog.name) # 输出: 阿黄 (继承自Animal)
print(dog.speak()) # 输出: 汪汪! (重写了speak方法)
- 多继承:子类继承自多个父类,其中父类的优先级是从左到右的(也就是说最左侧的父类就有最高的优先级)。
class Father:def skills(self):return "编程"class Mother:def skills(self):return "绘画"class Child(Father, Mother):def skills(self):# 调用父类方法father_skill = super().skills() # 两个父类中具有相同的方法,优先调用左侧的类中的方法mother_skill = Mother.skills(self)return f"{father_skill} 和 {mother_skill}"child = Child()
print(child.skills()) # 输出: 编程 和 绘画
- 继承的注意事项
- 谨慎使用多继承,可能导致"菱形继承"问题
- 优先使用组合而非继承,除非确实是"is-a"关系
- 抽象基类(ABC)可以定义接口规范
总结:Python的继承机制提供了强大的面向对象编程能力,合理使用可以大大提高代码的可维护性和可扩展性。
Python中的多态
- 多态的简介和动态绑定
- 多态是面向对象编程的三大特性之一(封装、继承、多态),它允许不同类的对象对同一消息做出不同的响应。在Python中,多态的实现非常灵活自然。
- 对多态的理解:Python的多态主要基于"鸭子类型"概念——“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子”。不关注对象的类型,而是关注对象的行为(方法)。
- 动态绑定:方法调用是在运行时根据对象的类型决定的。
- 多态的实现方式
- 运算符重载
class Vector:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):# 这里的other还不知道具体的是什么,但是可以在方法内部进行调用return Vector(self.x + other.x, self.y + other.y)def __str__(self):return f"Vector({self.x}, {self.y})"v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # 输出: Vector(4, 6)
- 鸭子类型的多态
class Car:def drive(self):return "汽车行驶中..."class Bicycle:def drive(self):return "自行车骑行中..."def start_vehicle(vehicle):print(vehicle.drive())car = Car()
bike = Bicycle()start_vehicle(car) # 输出: 汽车行驶中...
start_vehicle(bike) # 输出: 自行车骑行中...
- Python多态的优势
- 灵活性:不需要严格的继承关系,只要对象有相应的方法即可
- 可扩展性:添加新类不影响现有代码
- 简洁性:代码更简洁易读
Python的多态体现了其动态语言的特性,使得代码更加灵活和易于扩展。