了解 Python 3 中的类继承

2023-11-19

介绍

面向对象编程创建可重用的代码模式,以减少开发项目中的冗余。面向对象编程实现可回收代码的一种方法是通过继承,此时一个子类可以利用另一个基类的代码。

本教程将介绍 Python 中继承的一些主要方面,包括父类和子类如何工作、如何重写方法和属性、如何使用super()函数,以及如何使用多重继承。

先决条件

您应该在计算机或服务器上安装 Python 3 并设置编程环境。如果您还没有设置编程环境,可以参考安装和设置指南本地编程环境或对于一个服务器上的编程环境适合您的操作系统(Ubuntu、CentOS、Debian 等)

什么是继承?

遗产是指一个类使用另一个类中构造的代码。如果我们从生物学的角度考虑遗传,我们可以认为孩子从父母那里继承了某些特征。也就是说,孩子可以继承父母的身高或眼睛颜色。孩子也可能与父母同姓。

类称为儿童班 or 子类继承方法和变量家长班 or 基类.

我们可以想到一个父类叫做Parent具有类变量 for last_name, height, and eye_color那个孩子班Child将继承自Parent.

因为Child子类继承自Parent基类,即Child类可以重用代码Parent,允许程序员使用更少的代码行并减少冗余。

家长班

父类或基类创建一个子类或子类可以基于的模式。父类允许我们通过继承来创建子类,而不必每次都重新编写相同的代码。任何类都可以成为父类,因此它们各自都是功能齐全的类,而不仅仅是模板。

假设我们有一个将军Bank_account父类有Personal_account and Business_account儿童班。个人账户和企业账户之间的许多方法都是相似的,例如取款和存款的方法,因此这些可以属于Bank_account. The Business_account子类将具有特定于它的方法,可能包括收集业务记录和表单的方法,以及employee_identification_number多变的。

同样,一个Animal类可能有eating() and sleeping()方法,以及一个Snake子类可能包含其自己的特定hissing() and slithering()方法。

让我们创建一个Fish我们稍后将使用它的父类来构造鱼的类型作为其子类。除了特征之外,每条鱼都有名字和姓氏。

Info:要按照本教程中的示例代码进行操作,请通过运行以下命令在本地系统上打开 Python 交互式 shellpython3命令。然后,您可以复制、粘贴或编辑示例,方法是将它们添加到>>> prompt.

我们将创建一个名为的新文件fish.py并从__init__()构造方法,我们将填充first_name and last_name每个类的变量Fish对象或子类。

fish.py
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

我们已经初始化了我们的last_name带有字符串的变量"Fish"因为我们知道大多数鱼都会以此作为姓氏。

我们还添加一些其他方法:

fish.py
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")

我们添加了方法swim() and swim_backwards() to the Fish类,以便每个子类也能够使用这些方法。

因为我们要创造的大多数鱼都被认为是硬骨鱼(因为他们有一个由骨头制成的骨架)而不是软骨鱼(因为它们有一个由软骨制成的骨架),我们可以添加更多属性__init__() method:

fish.py
class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")

构建父类遵循与构建任何其他类相同的方法,除了我们正在考虑创建子类后将能够使用哪些方法。

儿童班

子类或子类是从父类继承的类。这意味着每个子类将能够使用父类的方法和变量。

例如,一个Goldfish子类Fish类将能够利用swim()中声明的方法Fish无需声明。

我们可以将每个子类视为父类的一个类。也就是说,如果我们有一个名为Rhombus和一个名为的父类Parallelogram,我们可以说一个Rhombus is a Parallelogram,就像一个Goldfish is a Fish.

子类的第一行看起来与非子类略有不同,因为您必须将父类作为参数传递给子类:

class Trout(Fish):

The Trout类是 的子级Fish班级。我们知道这一点是因为包含了这个词Fish在括号内。

对于子类,我们可以选择添加更多方法,覆盖现有的父方法,或者接受默认的父方法pass关键字,在本例中我们将执行以下操作:

fish.py
...
class Trout(Fish):
    pass

我们现在可以创建一个Trout对象,而无需定义任何其他方法。

fish.py
...
class Trout(Fish):
    pass

terry = Trout("Terry")
print(terry.first_name + " " + terry.last_name)
print(terry.skeleton)
print(terry.eyelids)
terry.swim()
terry.swim_backwards()

我们创建了一个Trout object terry它利用了每个方法Fish即使我们没有在类中定义这些方法Trout儿童班。我们只需要传递值"Terry" to the first_name变量,因为所有其他变量都已初始化。

当我们运行该程序时,我们将收到以下输出:

Output
Terry Fish bone False The fish is swimming. The fish can swim backwards.

接下来,让我们创建另一个包含自己的方法的子类。我们将这个类称为Clownfish,其特殊的方法将使其能够与海葵一起生活:

fish.py
...
class Clownfish(Fish):

    def live_with_anemone(self):
        print("The clownfish is coexisting with sea anemone.")

接下来,让我们创建一个Clownfish对象看看它是如何工作的:

fish.py
...
casey = Clownfish("Casey")
print(casey.first_name + " " + casey.last_name)
casey.swim()
casey.live_with_anemone()

当我们运行该程序时,我们将收到以下输出:

Output
Casey Fish The fish is swimming. The clownfish is coexisting with sea anemone.

输出显示Clownfish object casey能够使用Fish方法__init__() and swim()以及它的子类方法live_with_anemone().

如果我们尝试使用live_with_anemone()方法在一个Trout对象,我们会收到一个错误:

Output
terry.live_with_anemone() AttributeError: 'Trout' object has no attribute 'live_with_anemone'

这是因为该方法live_with_anemone()仅属于Clownfish儿童班,而不是Fish父类。

子类继承其所属父类的方法,因此每个子类都可以在程序中使用这些方法。

重写父方法

到目前为止,我们已经了解了子类Trout那个利用了pass关键字继承所有父类Fish行为,和另一个子类Clownfish它继承了所有父类的行为,并创建了自己特定于子类的独特方法。然而,有时我们会想要利用一些父类行为,但不是全部。当我们改变父类方法时override them.

在构造父类和子类时,记住程序设计非常重要,这样重写就不会产生不必要或多余的代码。

我们将创建一个Shark的儿童班Fish父类。因为我们创建了Fish课程的想法是我们将主要创造硬骨鱼,我们将不得不做出调整Shark相反,它是软骨鱼的一类。在程序设计方面,如果我们有不止一种非硬骨鱼,我们很可能希望为这两种鱼中的每一种创建单独的类。

与硬骨鱼不同,鲨鱼的骨骼是由软骨而不是骨头制成的。它们也有眼睑,无法向后游。然而,鲨鱼可以通过下沉来向后移动。

鉴于此,我们将重写__init__()构造方法和swim_backwards()方法。我们不需要修改swim()方法,因为鲨鱼是会游泳的鱼。我们来回顾一下这个子类:

fish.py
...
class Shark(Fish):
    def __init__(self, first_name, last_name="Shark",
                 skeleton="cartilage", eyelids=True):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim_backwards(self):
        print("The shark cannot swim backwards, but can sink backwards.")

我们已经覆盖了初始化参数__init__()方法,使得last_name变量现在设置为等于字符串"Shark", the skeleton变量现在设置为等于字符串"cartilage",以及eyelids变量现在设置为布尔值True。该类的每个实例也可以覆盖这些参数。

方法swim_backwards()现在打印的字符串与中的字符串不同Fish父类,因为鲨鱼不能像硬骨鱼那样向后游。

我们现在可以创建一个实例Shark子类,它仍然会使用swim()的方法Fish父类:

fish.py
...
sammy = Shark("Sammy")
print(sammy.first_name + " " + sammy.last_name)
sammy.swim()
sammy.swim_backwards()
print(sammy.eyelids)
print(sammy.skeleton)

当我们运行此代码时,我们将收到以下输出:

Output
Sammy Shark The fish is swimming. The shark cannot swim backwards, but can sink backwards. True cartilage

The Shark子类成功覆盖了__init__() and swim_backwards()的方法Fish父类,同时也继承swim()父类的方法。

当存在有限数量的比其他类更独特的子类时,重写父类方法可能会被证明是有用的。

The super()功能

随着super()函数,您可以访问已在类对象中覆盖的继承方法。

当我们使用super()函数时,我们将父方法调用到子方法中以使用它。例如,我们可能想用某些功能重写父方法的一个方面,但然后调用原始父方法的其余部分来完成该方法。

在给学生评分的程序中,我们可能想要一个儿童班级Weighted_grade继承自Grade父类。在幼儿班里Weighted_grade,我们可能想要覆盖calculate_grade()父类的方法,以便包含计算加权成绩的功能,但仍保留原始类的其余功能。通过调用super()函数我们就能够实现这一点。

The super()函数最常用的是__init__()方法,因为这是您最有可能需要为子类添加一些唯一性,然后从父类完成初始化的地方。

为了看看这是如何工作的,让我们修改我们的Trout儿童班。由于鳟鱼是典型的淡水鱼,让我们添加一个water变量为__init__()方法并将其设置为等于字符串"freshwater",但随后维护父类的其余变量和参数:

fish.py
...
class Trout(Fish):
    def __init__(self, water = "freshwater"):
        self.water = water
        super().__init__(self)
...

我们已经覆盖了__init__()方法中的Trout子类,提供不同的实现__init__()已由其父类定义Fish。内__init__()我们的方法Trout我们已经显式调用了类__init__()的方法Fish class.

因为我们已经重写了该方法,所以我们不再需要传递first_name作为参数Trout,如果我们确实传递了一个参数,我们将重置freshwater反而。因此我们将初始化first_name通过调用我们的对象实例中的变量。

现在我们可以调用父类的初始化变量,也可以使用唯一的子变量。让我们在一个实例中使用它Trout:

fish.py
...
terry = Trout()

# Initialize first name
terry.first_name = "Terry"

# Use parent __init__() through super()
print(terry.first_name + " " + terry.last_name)
print(terry.eyelids)

# Use child __init__() override
print(terry.water)

# Use parent swim() method
terry.swim()
Output
Terry Fish False freshwater The fish is swimming.

输出显示该对象terry of the Trout子类能够利用子类特定的__init__()多变的water同时还能够调用Fish parent __init__()的变量first_name, last_name, and eyelids.

内置Python函数super()允许我们使用父类方法,即使在子类中重写这些方法的某些方面也是如此。

多重继承

多重继承是指一个类可以从多个父类继承属性和方法。这可以让程序减少冗余,但也会引入一定程度的复杂性和歧义性,因此应该在整体程序设计时考虑清楚。

为了展示多重继承是如何工作的,让我们创建一个Coral_reef子类比继承自Coral类和一个Sea_anemone班级。我们可以在每个方法中创建一个方法,然后使用pass中的关键字Coral_reef儿童班:

珊瑚礁.py
class Coral:

    def community(self):
        print("Coral lives in a community.")


class Anemone:

    def protect_clownfish(self):
        print("The anemone is protecting the clownfish.")


class CoralReef(Coral, Anemone):
    pass

The Coral类有一个方法叫做community()打印一行,并且Anemone类有一个方法叫做protect_clownfish()打印另一行。然后我们将这两个类都调用到继承中tuple。这意味着CoralReef继承自两个父类。

现在让我们实例化一个CoralReef object:

珊瑚礁.py
...
great_barrier = CoralReef()
great_barrier.community()
great_barrier.protect_clownfish()

物体great_barrier被设置为CoralReef对象,并且可以使用两个父类中的方法。当我们运行该程序时,我们将看到以下输出:

Output
Coral lives in a community. The anemone is protecting the clownfish.

输出显示两个父类的方法在子类中得到了有效的使用。

多重继承允许我们在子类中使用多个父类的代码。如果在多个父类方法中定义了相同的方法,则子类将使用其元组列表中声明的第一个父类的方法。

尽管可以有效地使用多重继承,但应谨慎使用多重继承,以免我们的程序变得含糊不清且难以让其他程序员理解。

结论

本教程介绍了构建父类和子类、重写子类中的父方法和属性,使用super()函数,并允许子类继承多个父类。

面向对象编码中的继承可以遵守软件开发的 DRY(不要重复自己)原则,从而可以用更少的代码和重复完成更多的工作。继承还迫使程序员思考如何设计他们正在创建的程序,以确保代码有效且清晰。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 Python 3 中的类继承 的相关文章

  • 为什么Python有最大递归深度?

    Python有最大递归深度 但没有最大迭代深度 为什么递归受到限制 把递归当成迭代来对待 而不限制递归调用的次数不是更自然吗 我只想说这个问题的根源来自于尝试实现流 参见这个问题 https stackoverflow com questi
  • Pyenv 无法在 Cygwin 上安装 python: ModuleNotFoundError: No module named '_ctypes'

    我正在尝试设置 Cygwin 环境以使用 pyenv 来管理 python 版本 我没有管理员权限 所以我使用以下命令运行设置 no admin flag 我使用 Cygwin 包管理器应用程序解决了一些依赖关系 但我被困在了这一点上 Mo
  • Python 小数.InvalidOperation 错误

    当我运行这样的东西时 我总是收到此错误 from decimal import getcontext prec 30 b 2 3 Decimal b Error Traceback most recent call last File Te
  • 创建一个打开文件并创建字典的函数

    我有一个正在处理的文件 我想创建一个读取文件并将内容放入字典中的函数 然后该字典需要通过 main 函数传递 这是主程序 它无法改变 我所做的一切都必须与主程序配合 def main sunspot dict file str raw in
  • Python 使用 M2Crypto 通过 S/MIME 对消息进行签名

    我现在花了几个小时 但找不到我的错误 我想要一个简单的例程来创建 S MIME 签名消息 稍后可以与 smtplib 一起使用 这是我到目前为止所拥有的 usr bin python2 7 coding utf 8 from future
  • 将 matplotlib png 转换为 base64 以在 html 模板中查看

    背景 你好 我正在尝试制作一个简单的网络应用程序 按照教程计算阻尼振动方程 并将结果的 png 返回到 html 页面 然后将其转换为 Base64 字符串 Problem 该应用程序运行正常 只是在计算结果时返回损坏的图像图标 可能是因为
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 使用字母而不是数字进行顺序计数[重复]

    这个问题在这里已经有答案了 我需要一种方法 将字符串 递增 到 z 然后将 aa 递增到 az 然后将 ba 递增到 bz 依此类推 就像 Excel 工作表中的列一样 我将向该方法提供前一个字符串 它应该增加到下一个字母 PSEUDO C
  • 对图像使用 Pixellib 自定义训练时出现 input_image 元形状错误

    我正在使用 Pixellib 来训练自定义图像实例分割 我创建了一个数据集 可以在下面的链接中看到 数据集 https drive google com drive folders 1MjpDNZtzGRNxEtCDcTmrjUuB1ics
  • 如何使用 msgpack 进行读写?

    如何序列化 反序列化字典data with msgpack http msgpack org The Python 文档 http msgpack python readthedocs io en latest badge latest似乎
  • 在Python中计算结构体的CRC

    我有以下结构 来自 C 中的 NRPE 守护程序代码 typedef struct packet struct int16 t packet version int16 t packet type uint32 t crc32 value
  • 如何在 Python 中执行相当于预处理器指令的操作?

    有没有办法在 Python 中执行以下预处理器指令 if DEBUG lt do some code gt else lt do some other code gt endif There s debug 这是编译器预处理的特殊值 if
  • python中打印字符串的长度

    有没有什么方法可以找到 即使是最好的猜测 Python中字符串的 打印 长度 例如 potaa bto 是 8 个字符len但 tty 上只打印 6 个字符宽 预期用途 s potato x1b 01 32mpotato x1b 0 0mp
  • 从 Python 中编译的正则表达式中提取命名组正则表达式模式

    我有一个 Python 正则表达式 其中包含多个命名组 但是 如果先前的组已匹配 则可能会错过与一组匹配的模式 因为似乎不允许重叠 举个例子 import re myText sgasgAAAaoasgosaegnsBBBausgisego
  • 在 Tensorflow 2.0 中的简单 LSTM 层之上添加 Attention

    我有一个由一个 LSTM 和两个 Dense 层组成的简单网络 如下所示 model tf keras Sequential model add layers LSTM 20 input shape train X shape 1 trai
  • 测试中的模型 - Django 1.7 问题

    我正在尝试将我的项目移植为使用 Django 1 7 除了一件事之外 一切都很好 测试文件夹内的模型 Django 1 7 新迁移在内部运行 migrate 命令 在运行syncdb之前 这意味着如果模型未包含在迁移中 它将不会填充到数据库
  • Jinja2中获取请求参数

    如何检索请求参数a在 Jinja2 模板中 http foo bar a 1 我这个答案有点晚了 但其他解决方案并没有真正考虑到您对 Flask 的使用 事实上 您将 Flask 与 Jinja2 一起使用 这使得您的情况与其他框架有点不同
  • 如何让你的精灵在pygame中跳跃

    目前我已经制作了一个平台游戏 可以左右移动我的角色 他从地上开始 关于如何让他跳的任何想法 因为我不明白 目前 如果我按住向上键 我的玩家精灵将连续向上移动 或者如果我按下它 我的玩家精灵将向上移动并保持向上 我想找个办法远离他 让我重新跌
  • 在Python中从列表中获取n个项目组的惯用方法? [复制]

    这个问题在这里已经有答案了 给定一个列表 A 1 2 3 4 5 6 是否有任何惯用的 Pythonic 方式来迭代它 就好像它是 B 1 2 3 4 5 6 除了索引之外 这感觉像是 C 的遗留物 for a1 a2 in A i A i
  • Shap - 颜色条不显示在摘要图中

    显示summary plot时 不显示颜色条 shap summary plot shap values X train 我尝试过改变plot size 当绘图较高时 会出现颜色条 但它非常小 看起来不应该 shap summary plo

随机推荐

  • 有用的 Bash 别名和函数简介

    介绍 在命令行上操作的越多 您就越会发现您使用的大多数命令只是可用命令的很小的子集 大多数任务都是习惯性的 您可能每天都以相同的方式运行这些任务 虽然许多最常见的命令实用程序的制造商试图通过使用缩写名称来消除无关的输入 想想通过输入 ls
  • 在 Ubuntu 14.04 上使用 Consul(服务发现系统)简介

    介绍 Consul是一个分布式 高可用 数据中心感知的服务发现和配置系统 它可用于在灵活而强大的界面中呈现服务和节点 使客户端始终能够了解其所属基础设施的最新视图 Consul 提供了许多不同的功能 用于提供有关您的基础设施的一致且可用的信
  • 如何在 Ubuntu 22.04 上使用 uWSGI 和 Nginx 为 Flask 应用程序提供服务

    介绍 在本指南中 您将使用FlaskUbuntu 22 04 上的微框架 本文的大部分内容将讨论如何设置uWSGI应用服务器以及如何启动应用程序和配置Nginx充当前端反向代理 先决条件 在开始本指南之前 您应该 安装了 Ubuntu 22
  • 如何使用 Nginx、Let's Encrypt 和 Docker Compose 保护容器化 Node.js 应用程序

    介绍 有多种方法可以增强您的灵活性和安全性Node js应用 用一个反向代理 like Nginx为您提供负载平衡请求 缓存静态内容和实施传输层安全 TLS 在服务器上启用加密 HTTPS 可确保与应用程序之间的通信保持安全 在容器上使用
  • Python 中的 numpy.append()

    Python numpyappend 函数用于合并两个数组 该函数返回一个新数组 原数组保持不变 NumPy append 语法 函数语法为 numpy append arr values axis None The arr可以是类似数组的
  • 如何使用 Apache 和 Nginx 创建临时和永久重定向

    介绍 HTTP 重定向或 URL 重定向是一种将一个域或地址指向另一个域或地址的技术 重定向有很多用途 并且需要考虑几种不同类型的重定向 每当站点需要将请求一个地址的人定向到另一个地址时 就会使用重定向 当您创建内容和管理服务器时 您经常会
  • eclipse.ini vm 参数 - eclipse.ini 文件位置 Mac、Windows

    eclipse ini是用于控制Eclipse启动的配置文件 我们可以使用 Xms Xmx 参数配置 Eclipse VM 参数 例如要使用的 JDK eclipse ini vm permgen 空间 最大和最小堆大小 eclipse i
  • 如何在 Java 中将字符串转换为数组

    有时我们不得不分开字符串到数组基于分隔符或某些正则表达式 例如 读取 CSV 文件行并解析它们以将所有数据获取到字符串数组 在本教程中 我们将学习如何在 Java 程序中将字符串转换为数组 Java 中的字符串到数组 字符串类split S
  • Java优先级队列

    我们时不时地需要以特定的顺序处理队列中的项目 优先级队列是一种完成这项工作的数据结构 Java优先级队列与 普通 不同queue 它不是 先进先出 而是按优先级顺序检索项目 Java优先级队列 The java util PriorityQ
  • Java 中的 CallableStatement 示例

    java中的CallableStatement用于从java程序中调用存储过程 存储过程是我们在数据库中为某些任务编译的一组语句 当我们处理复杂场景的多个表时 存储过程很有用 我们可以将所需的数据发送到存储过程 并在数据库服务器本身中执行逻
  • Docker 详解:如何容器化并使用 Nginx 作为代理

    Status 已弃用 本文已弃用 不再维护 Reason 本文中的技术已经过时 可能不再反映 Docker 最佳实践 请参阅 Docker 生态系统 常用组件简介 如何在 Ubuntu 14 04 上的 Docker 容器中运行 Nginx
  • 如何在 Ruby 中使用字符串方法

    介绍 Ruby strings有许多内置方法可以轻松修改和操作文本 这是许多程序中的常见任务 在本教程中 您将使用字符串方法来确定字符串的长度 索引和拆分字符串以提取子字符串 添加和删除空格和其他字符 更改字符串中字符的大小写以及查找和替换
  • Python 字符串包含

    Python String 类有 contains 我们可以使用它来检查它是否包含另一个字符串的函数 Python 字符串包含 Python字符串 contains 是一个实例方法 根据字符串对象是否包含指定的字符串对象 返回布尔值 Tru
  • 如何在 Ubuntu 14.04 上使用 Docker 和 Docker Compose 配置持续集成测试环境

    文章来自Docker 介绍 持续集成 CI 是指开发人员的实践整合尽可能频繁地编写代码 并且每次提交在合并到共享存储库之前和之后都会经过测试自动构建 CI speeds up your development process and min
  • Android BroadcastReceiver 示例教程

    今天我们将讨论并实现Android BroadcastReceiver 它是Android Framework中非常重要的组件 Android 广播接收器 Android BroadcastReceiver是android的一个休眠组件 用
  • 蟒蛇集

    In this tutorial we are going to learn Python Set In our previous article we learnt about Python String You can learn it
  • 如何在 Ubuntu 12.10 上使用 Python 创建 Nagios 插件

    介绍 Python 是 Linux 上默认提供的流行命令处理器 我们之前已经介绍过如何在Ubuntu 12 10 x64上安装Nagios监控服务器 这次 我们将扩展这个想法并使用 Python 创建 Nagios 插件 这些插件将在客户端
  • 如何编辑 Sudoers 文件

    介绍 权限分离是 Linux 和类 Unix 操作系统中实现的基本安全范例之一 普通用户以有限的权限进行操作 以减少对自己环境 而不是更广泛的操作系统 的影响范围 一个特殊的用户 称为root has 超级用户特权 这是一个管理帐户 没有普
  • JSTL 教程、JSTL 标签示例

    JSTL 代表JSP 标准标签库 JSTL 是标准标记库 它提供标记来控制 JSP 页面行为 JSTL 标签可用于迭代和控制语句 国际化 SQL 等 我们将在本 JSTL 教程中详细研究 JSTL 标签 之前我们看到了如何使用JSP EL
  • 了解 Python 3 中的类继承

    介绍 面向对象编程创建可重用的代码模式 以减少开发项目中的冗余 面向对象编程实现可回收代码的一种方法是通过继承 此时一个子类可以利用另一个基类的代码 本教程将介绍 Python 中继承的一些主要方面 包括父类和子类如何工作 如何重写方法和属