继续创作,加快成长!这是我参加「日新方案 10 月更文挑战」的第 26 天,点击查看活动概况

1 类承继

Python 是面向对象的编程语言,因而支持面向对象的三大特性之一:承继。

承继是代码重用的一种途径,Python 中的承继就像现实生活中的承继一样,子类能够顺利承继父类的特点或办法。允许咱们再对象之间创立杂乱且类似现实国际的联系。

承继父类的类称为子类、派生类或扩展类,被承继的类被称为父类、超类或基类。

在之前的文中学到 Python 中的结构函数,并且每一个类都有一个结构函数 __init__() ,在 Python 中任何类都是承继于最大的基类 Object,如下所示:

Python 3.10.4 (v3.10.4:9d38120e33, Mar 23 2022, 17:29:05) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> dir(object)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> 

Python 中承继类的语法如下:

class SubClass(SuperClass):

1.1 承继的简略比如

先来看一个简略的承继比如,假如有一个 Car 类承继于更通用的类 Vehicle,然后也能够界说一个 Motorcyle 类,承继图如下:

一文带你了解 Python 中的继承知识点

Python 代码实现如上承继联系,如下:

class Vehicle:
    def __init__(self, started =  False, speed = 0):
        self.started = started
        self.speed = speed
    def start(self):
        self.started = True
        print("发动,皮皮虾咱们走")
    def stop(self):
        self.speed = 0
    def increaseSpeed(self, delta):
        if self.started:
            self.speed += delta
            print("Vroooooom!")
        else:
            print("还没发动呢!")
class Car(Vehicle):
    trunk_open = False
    def open_trunk(self):
        self.trunk_open = True
    def close_trunk(self):
        self.trunk_open = False

咱们的汽车承继了车辆类的一切办法和变量,但添加了一个额定的变量和两个办法来操作后备箱。

有时你想掩盖承继的 __init__() 函数。为了演示,咱们能够创立一个摩托车类。大多数摩托车都有一个中心支架。咱们将在初始化时添加输出或输入的功能:

class Motorcycle(Vehicle):
    def __init__(self, center_start_out = False):
        self.center_start_out = center_start_out
        super().__init__()
   def start(self):
        print("Sorry, out of fuel!")

需求留意的是,在重写结构函数时,咱们承继的父类的结构函数不会被改动。假如想要更改这个功能,需求自己调用它。这是通过 super() 函数完结回来父类的引用,然后才干调用父类的结构函数。

class Vehicle:
    def __init__(self, started =  False, speed = 0):
        self.started = started
        self.speed = speed
    def start(self):
        self.started = True
        print("发动,皮皮虾咱们走")
    def stop(self):
        self.speed = 0
    def increaseSpeed(self, delta):
        if self.started:
            self.speed += delta
            print("Vroooooom!")
        else:
            print("还没发动呢!")
class Car(Vehicle):
    trunk_open = False
    def open_trunk(self):
        self.trunk_open = True
    def close_trunk(self):
        self.trunk_open = False
class Motorcycle(Vehicle):
    def __init__(self, center_start_out = False):
        self.center_start_out = center_start_out
        super().__init__()
V = Vehicle()
C = Car()
M = Motorcycle()
print(type(V))
print(type(C))
print(type(M))
print("摩托车是交通工具的实例吗?",isinstance(M, Vehicle))

super() 函数回来一个代表父类的暂时对象。这用于拜访父类的办法和特点。在 super() 函数的帮助下,咱们还能够拜访被掩盖的办法。

运转上面代码的成果如下:

一文带你了解 Python 中的继承知识点

2 承继的类型

2.1 单承继

单承继便是一个子类只要一个基类的承继方法,显现图如下:

一文带你了解 Python 中的继承知识点

最基本的比如如下:

class Animal:
  print("我是动物")
class Cat(Animal):
  print("我是猫")

2.2 多承继

多承继便是一个子类能够承继多个父类的承继方法,相关于单承继来说,多承继更杂乱,容易造成菱形承继问题,即两个父类同时承继了一个基类,而子类会包括多个父类的内容,产生代码歧义。

多承继结构图:

一文带你了解 Python 中的继承知识点

语法结构如下:

class A:
  def __init__(self, name):
    self.name = name
  def introduction(self):
    print("我叫", self.name)
class B:
  def __init__(self, age):
    self.age = age
  def introduction(self):
    print("我今年 %d 岁了" % self.age)
class C(A, B):
  pass
c = C(18)
c.introduction()

运转代码:

我叫 18

从上面的履行成果来看,本来想介绍年龄,最后却输出了“我叫 18”,这种现象便是承继次序导致的,类 A 在类 B 的前面,所以关于同名的特点和办法子类都会调用 类 A 的。

2.3 多级承继

当一个类承继一个子类时,它被称为多级承继。承继子类的类被称为孙子类。多级承继会导致孙子和子联系。孙子类能够拜访子类和父类的特点。

多级承继结构图:

一文带你了解 Python 中的继承知识点

class Parent:
    str1 = "Python"
class Child(Parent):
    str2 = " is the best programming?"
class GrandChild(Child):
    def get_str(self):
        print(self.str1 + self.str2)
person = GrandChild()
person.get_str()

运转成果:

Python is the best programming?

在上面的代码示例中,GrandChild 是 Child 的一个子类,而 Child 是 Parent 的一个子类。因而,GrandChild 能够拜访父类和子类的特点。

2.4 分层承继

当多个类承继同一个类时,称为分层承继。结构图如下:

一文带你了解 Python 中的继承知识点

代码如下:

class SuperClass:
    x = 2022
class SubClass1(SuperClass):
    pass
class SubClass2(SuperClass):
    pass
class SubClass3(SuperClass):
    pass
a = SubClass1()
b = SubClass2()
c = SubClass3()
print(a.x, b.x, c.x)

运转成果:

(2022, 2022, 2022)

2.5 Python中的混合承继

一种以上承继类型的组合称为混合承继。结构图如下:

一文带你了解 Python 中的继承知识点

代码比如如下:

class X:
    num = 2023
class A(X):
    pass
class B(A):
    pass
class C(A):
    pass
class D(B, C):
    pass
ob = D()
print(D.num)

在上面的代码示例中,咱们结合了多级承继、多重承继和分层承继,因而创立了混合承继。输出成果:

2023

3 总结

承继允许咱们界说承继另一个类的一切办法和特点的类。父类是承继的类,也称为基类、派生类。子类是从另一个类承继的类,也称为派生类。

本文介绍了 Python 的承继办法和承继的 5 种分类,并在简略的比如中实践了各种承继的方法。但承继的实践用法可不会像本文这样简略,往后介绍更多相关的常识。

希望本文能对你有所帮助,假如喜爱本文,能够点个重视。

这里是世界之一粟,下一篇文章见!

世界古今无有穷期,一生不过须臾,当思奋争。

参考链接:

  • Python 官方文档——9.5. Inheritance
  • Inheritance in Python with Types and Examples – Python Geeks