1.继承
Python中的继承是一种面向对象编程(OOP)的基本概念,它允许我们基于一个或多个现有类来创建新类。继承可以让我们利用现有代码,并扩展或修改它以满足新的需求。以下是Python继承的一些关键概念和用法:
基本概念
-
基类(Base Class):也称为父类(Parent Class),是被继承的类。
-
派生类(Derived Class):也称为子类(Child Class),是从基类继承而来的类。
继承类型
-
单继承:一个类只继承一个基类。
-
多继承:一个类继承多个基类(Python支持多继承)。
-
层次继承:多个类继承同一个基类。
-
混合继承:同时存在单继承和多继承。
语法
python
class BaseClass:
# 基类的方法和属性
pass
class DerivedClass(BaseClass):
# 派生类的方法和属性
pass
特点
-
方法重写:子类可以重写(Override)基类的方法。
-
属性继承:子类继承基类的属性。
-
构造器继承:子类的构造器需要正确调用基类的构造器,通常使用 super()。
-
代码复用:继承允许子类复用父类的代码,减少重复代码,提高开发效率。
-
扩展性:子类可以扩展父类的功能,添加新的属性和方法。
-
多态性:继承允许子类重写父类的方法,实现多态性,即同一个接口可以有不同的实现。
方法解析顺序(MRO)
Python使用C3线性化算法来确定方法解析顺序,即确定在多继承情况下方法调用的顺序。
示例
python
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclass must implement this method")
class Dog(Animal):
def speak(self):
return f"{self.name} says woof!"
class Cat(Animal):
def speak(self):
return f"{self.name} says meow!"
# 单继承
dog = Dog("Buddy")
print(dog.speak()) # Buddy says woof!
# 多继承 - 一个类继承多个基类
class DogAndCat(Dog, Cat):
def speak(self):
return super().speak() # 根据MRO选择调用Dog的speak方法
dog_and_cat = DogAndCat("Charlie")
print(dog_and_cat.speak()) # Charlie says woof!
重要概念
-
多态:允许同一个接口接受不同的数据类型。
-
封装:隐藏对象的内部状态和实现细节。
-
抽象:定义抽象基类(ABC)来规定子类必须实现的方法。
抽象基类(ABC)
Python提供了 abc 模块来支持抽象基类。抽象基类可以包含抽象方法,这些方法必须被子类重写。
python
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
# 尝试创建抽象类的实例将会引发错误
# animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods speak
重写父类方法:
子类可以重写(Override)父类的方法,以提供特定的实现或扩展功能。
class Parent:
def show(self):
print("Parent's method")
class Child(Parent):
def show(self): # 重写父类方法
print("Child's method")
调用父类方法:
使用 super()
函数调用父类的方法,确保父类的构造器和方法被正确执行。
class Child(Parent):
def show(self):
super().show() # 调用父类的 show 方法
print("Additional behavior")
构造器和析构器:
__init__
:构造器,用于初始化对象。__del__
:析构器,用于销毁对象时的清理工作。
继承的优点
-
代码复用:减少重复代码,提高开发效率。
-
扩展性:方便扩展现有功能。
-
维护性:易于维护和更新代码。
继承的缺点
-
紧密耦合:子类与基类耦合度高,基类的变化可能影响子类。
-
脆弱性:基类的实现细节可能对子类造成影响。
-
继承层次深:过度使用继承可能导致继承层次过深,难以理解和维护。
继承是Python中实现代码复用和多态的强大工具,但应谨慎使用,避免过度继承和设计复杂的继承体系。
继承和组合:
继承不是复用代码的唯一方式。组合(Composition)也是一种方式,它通过将一个类的实例作为另一个类的成员变量来实现。
组合与继承的区别
- 继承:是一种"是一个(is-a)"的关系,子类继承父类的所有特性和行为。
- 组合:是一种"有一个(has-a)"的关系,一个类可以包含另一个类的对象作为自己的属性。