一文深入了解Python中的继承知识点

作者:宇宙之一粟 时间:2023-01-16 19:57:16 

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 种分类,并在简单的例子中实践了各种继承的方式。但继承的实际用法可不会像本文这样简单,今后介绍更多相关的知识。

来源:https://juejin.cn/post/7158843760707633166

标签:Python,继承
0
投稿

猜你喜欢

  • np.dot()函数的用法详解

    2023-06-14 02:12:21
  • sqlserver bcp(数据导入导出工具)一般用法与命令详解

    2024-01-27 03:12:08
  • python 合并文件的具体实例

    2022-03-12 03:18:26
  • Python爬虫实现的根据分类爬取豆瓣电影信息功能示例

    2022-10-14 04:27:51
  • layui 动态设置checbox 选中状态的例子

    2024-04-18 09:28:05
  • spring mvc4.1.6 spring4.1.6 hibernate4.3.11 mysql5.5.25开发环境搭建图文教程

    2024-01-23 12:27:19
  • SQL Server的链接服务器技术小结

    2024-01-17 03:41:22
  • Python线性拟合实现函数与用法示例

    2023-12-04 14:29:33
  • MySQL数据库磁盘优化

    2008-11-24 17:29:00
  • Go 语言入门之net/url 包

    2024-05-29 22:06:33
  • 往MySQL中存储图片的方法

    2024-01-17 15:57:49
  • oracle 日期函数

    2010-07-23 13:32:00
  • 使用Python获取字典键对应值的两种方法

    2022-08-04 05:25:16
  • 对于Python中线程问题的简单讲解

    2023-12-28 10:16:31
  • VueJs 将接口用webpack代理到本地的方法

    2024-06-05 15:30:50
  • Mysql错误1366 - Incorrect integer value解决方法

    2024-01-13 03:21:35
  • mysql 5.7.19 winx64免安装版配置教程

    2024-01-14 00:27:36
  • 背景图片千万不要gzip压缩,尤其是PNG

    2009-06-19 12:42:00
  • 在WordPress中创建自定义页面模板方法详解

    2023-05-17 09:33:49
  • Vue CLI3.0中使用jQuery和Bootstrap的方法

    2023-07-02 17:08:15
  • asp之家 网络编程 m.aspxhome.com