首页 > 编程语言 >一文带你了解 Python 中的继承知识点

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

时间:2022-10-27 14:32:31浏览次数:67  
标签:__ 知识点 一文 Python self 继承 print class def

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

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 中的继承知识点_父类_02

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 中的继承知识点_python_03

2 继承的类型

2.1 单继承

单继承就是一个子类只有一个基类的继承方式,显示图如下:

一文带你了解 Python 中的继承知识点_父类_04

最基本的例子如下:

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

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

2.2 多继承

多继承就是一个子类可以继承多个父类的继承方式,相对于单继承来说,多继承更复杂,容易造成菱形继承问题,即两个父类同时继承了一个基类,而子类会包含多个父类的内容,产生代码歧义。

多继承结构图:

一文带你了解 Python 中的继承知识点_子类_05

语法结构如下:

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 中的继承知识点_子类_06

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 中的继承知识点_父类_07

代码如下:

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 中的继承知识点_python_08

代码例子如下:

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,self,继承,print,class,def
From: https://blog.51cto.com/yuzhou1su/5798628

相关文章

  • Python7-实战
    实战01(修改手机默认语言)1classPhone:2'''手机类'''3def__init__(self,language='英文'):4iflanguage=='英文':5print("智能手......
  • conda管理python环境
    Anaconda使用教程Anaconda详细安装使用教程condacreate-nlearnpython=3//创建一个名为learn的环境并指定python版本为3(最新版本)condaactivatelearn//激活l......
  • python遇到IndexError: only integers, slices (`:`), ellipsis (`...`)……
    完整错误信息如下:IndexError:onlyintegers,slices(​​:​​​),ellipsis(​​...​​​),numpy.newaxis(​​None​​)andintegerorbooleanarraysarevalid......
  • python获取文件夹、文件大小&hiberfil.sys
    跑了个很简单的程序,c盘突然爆炸增加,顿时SSD120G的盘只剩下几个G,所以有需求看看那些文件占用了大量空间。(事先通过360大文件扫描、日期排序分析未发现异常)importosimportsy......
  • python的开源微信接口
    开源微信接口文档地址:​​https://itchat.readthedocs.io/zh/latest/​​​github地址:​​​https://github.com/littlecodersh/itchat​​如下举例:importitchatitchat.......
  • OpenCV-Python learning-13.人脸检测
    如下,调用opencv使用摄像头或视频进行人脸检测,也可以在函数​​recognize(img)​​​传入​​img=cv2.imread('face.jpg')​​​。其中,人脸级联分类器xml文件我引用的是anaco......
  • python 格式化xml字符串
    【前言】本文主要介绍python中的字符串格式化,通过基本概念,使用方法及例子学习python字符串格式化的两种主要形式:字符串格式化表达以及字符串格式化方法调用。字符串......
  • python9-eg
    实例01(模拟幼儿园分苹果)1defdevition():2'''功能:分苹果'''3print("\n=================分苹果了===============\n")4apple=int(input("请输入......
  • python脚本编写流程
    自己实现了一个自动打卡的脚本文件,记录一下过程编写脚本流程1.编写脚本2.将脚本设置为定时启动其实自己用的话,就是这两步,但是我后面多做了两件事3.电脑设置定时提醒......
  • 【JSON】Python读取JSON文件报错json.decoder.JSONDecodeError的问题
    报错json.decoder.JSONDecodeError:Expectingpropertynameenclosedindoublequotes:line*column*(char*)解决百度到了多种情况:编码使用UTF-8键值用双引......