Python篇——继承及多重继承

引言

  • 为什么要用到继承呢?因为继承可以减少代码冗余以及提高代码的重用性。

1 继承

  • 继承用于类的创建,继承描述类与类之间的关系
  • 新创建的类是子类,被继承的类是父类
  • 子类继承父类的属性和方法

1.1 场景条件——创建父类

定义Person类,有两个属性:name和age,和一个方法greet,输出:Hi,my name is...

代码实现:

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def greet(self):
        print("Hi,my name is {}.".format(self.name))

创建对象并调用类中构造函数:

p1 = Person("Mike",22)
p1.greet()

输出:

Hi,my name is Mike.

1.2 增加场景条件——创建子类

创建Person类的子类Student,Student中增加一个属性grade,grade表示年级。

代码实现:

class Student(Person):                    #Student是Person类的子类
    def __init__(self,name,age,grade):    #调用父类的构造方法
        super().__init__(name,age)        #super()函数返回一个临时对象
        self.grade = grade                #该临时对象可以调用父类的方法
    def greet(self):                     #覆盖父类的函数greet
        print("Hi,my name is {} and I'm a student in grade {}.".format(self.name,self.grade))

创建对象并调用类中构造函数:

s1 = Student("Jacob",20,3)
s1.greet()

输出:

Hi,my name is Jacob and I'm a student in grade 3.

 

2 多重继承

2.1 实现

python还支持多重继承,就是可以同时继承多个父类的属性和方法。

在Python中,多重继承是通过在定义类时,在类名后的括号中列出多个父类来实现的。

代码实现案例:

class Base1:
    def f1(self):
        print("这是Basel类中的f1函数")

class Base2:
    def f2(self):
        print("这是Base2类中的f2函数")

class C(Base1,Base2):
    pass

创建对象并调用类中构造函数:

c = C()
c.f1()    #输出  这是Basel类中的f1函数
c.f2()    #输出  这是Base2类中的f2函数

输出

这是Basel类中的f1函数
这是Base2类中的f2函数

2.2 多重继承的优缺点

优点:

  • 代码重用:多重继承允许子类重用多个父类的代码,这有助于减少重复代码,并使代码更加模块化
  • 灵活性:多重继承提供了更大的灵活性,允许子类从多个不同的父类中获取所需的功能

缺点:

  • 复杂性:多重继承可能导致复杂的类层次结构,这可能会使代码难以理解、维护和调试
  • 菱形继承问题(钻石问题):当两个父类都从同一个类继承时,可能会导致方法解析顺序不明确,从而产生不可预见的结果。虽然Python使用C3线性化算法来解决这个问题,但在某些情况下,它仍然可能导致困惑。
  • 紧耦合:多重继承可能导致类之间的紧耦合,这意味着一个类的更改可能会影响多个子类。这可能会降低代码的可维护性和可扩展性。
  • 替代方案:在许多情况下,可以通过其他方法(如组合、接口、混入(Mixin)等)来实现多重继承的功能,而无需使用多重继承。这些替代方法通常更简单、更易于理解,并且更符合单一职责原则。
posted @ 2024-07-15 13:32  颍2333  阅读(4)  评论(0编辑  收藏  举报