一文深入了解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 代码实现如上继承关系,如下:
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()
函数的帮助下,我们还可以访问被覆盖的方法。
运行上面代码的结果如下:
2 继承的类型
2.1 单继承
单继承就是一个子类只有一个基类的继承方式,显示图如下:
最基本的例子如下:
class Animal:
print("我是动物")
class Cat(Animal):
print("我是猫")
2.2 多继承
多继承就是一个子类可以继承多个父类的继承方式,相对于单继承来说,多继承更复杂,容易造成菱形继承问题,即两个父类同时继承了一个基类,而子类会包含多个父类的内容,产生代码歧义。
多继承结构图:
语法结构如下:
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 多级继承
当一个类继承一个子类时,它被称为多级继承。继承子类的类被称为孙子类。多级继承会导致孙子和子关系。孙子类可以访问子类和父类的属性。
多级继承结构图:
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 分层继承
当多个类继承同一个类时,称为分层继承。结构图如下:
代码如下:
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中的混合继承
一种以上继承类型的组合称为混合继承。结构图如下:
代码例子如下:
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 SqlAlchemy的使用方法,分享给大家供大家参考,具体内容如下1.初始化连接from sqlalchemy i
- PHP xpath() 函数定义和用法xpath()函数运行对 XML 文档的 XPath 查询。如果成功,该函数返回 SimpleXMLE
- 背景最近在测试一款软件的关闭第三方窗口的功能,感觉实现应该挺简单的。所以就尝试了。由于说它的实现是靠c++实现的,本人对c++实在不在行,但
- 1.什么是并发编程并发编程是实现多任务协同处理,改善系统性能的方式。Python中实现并发编程主要依靠进程(Process):进程是计算机中
- 利用Python正则表达式匹配字符串中的http链接。主要难点是用正则表示出http 链接的模式。import repattern = re
- 这篇文章阐述的是一种函数式编程(functional-programming)设计模式,我称之为惰性函数定义(Lazy Function D
- 本文实例讲述了python实现得到一个给定类的虚函数的方法,分享给大家供大家参考。具体如下:现来看看如下代码:import wx for m
- 安装pyqt5和pyqt5-tools利用pyqt5编写GUI界面,首先需要下载pyqt5以及相应的pyqt5-tools,我的python
- 本文实例讲述了PHP中soap的用法,分享给大家供大家参考。具体用法分析如下:PHP 使用soap有两种方式。一、用wsdl文件服务器端:&
- 阅读上一篇:成为一个顶级设计师的第一准则限制你的色彩成为一个顶级设计师的7个简单原则的第二部分限制使用你的色彩。好象上个准则是让你限制用你的
- # set 不支持索引和切片,是一个无需的不重复得到容器# 类似于字典,但是只有key 没有value# 创建集合dic1={}set1={
- 本文实例讲述了PHP商品秒杀问题解决方案。分享给大家供大家参考,具体如下:引言假设num是存储在数据库中的字段,保存了被秒杀产品的剩余数量。
- 1、线程池模块引入from concurrent.futures import ThreadPoolExecutor2、使用线程池一个简单的
- 本文实例讲述了Python使用re模块实现信息筛选的方法。分享给大家供大家参考,具体如下:背景平时工作中,我们经常会处理大量的元数据(Raw
- 每次在操作数据库的时候最烦的就是根据表单提交的内容写sql语句,特别是字段比较多的时候很麻烦,动不动就容易写错。所以我就写了下面的生成sql
- 本文实例讲述了php逐行读取txt文件写入数组的方法。分享给大家供大家参考。具体如下:假设有user.txt文件如下:user01user0
- 刚才运行了一段代码,来查看Request.ServerVariables里面有多少值,看了一下,共50个!代码<%=Request.S
- 在使用SQL Server 的过程,中由于经常需要从多个不同地点将数据集中起来或向多个地点复制数据,所以数据的导出,导入是极为常见的操作.我
- 本文实例讲述了Python学习笔记之Break和Continue用法。分享给大家供大家参考,具体如下:Python 中的Break 和 Co
- 前言Python中,.whl文件是使用wheel格式存储的一种Python安装包,同时也是一个标准的内置包格式。可以将其看作Python库的