Python--案例练习

案例:

class Spam(object):
    num_instane = 0

    @staticmethod
    def count():
        Spam.num_instane += 1

    def __init__(self):
        self.count()

class Sub(Spam):
    num_instane = 0

class Other(Spam):
    num_instane = 0

x = Spam()
y1, y2 = Sub(), Sub()
z1, z2, z3 = Other(), Other(), Other()
print(x.num_instane, y1.num_instane, z1.num_instane)
print(Spam.num_instane, Sub.num_instane, Other.num_instane)

解释如下:

  1. Spam.num_instane 的初始值为 0。
  2. 在 Spam 类中,__init__ 方法会调用 count 方法,该方法将 Spam.num_instane 增加 1。
  3. 在创建 x 的时候,调用了 Spam 的构造函数,因此 Spam.num_instane 被增加了 1,此时 Spam.num_instane 等于 1。
  4. 创建 y1 和 y2 时,虽然它们是 Sub 类的实例,但 Sub 类继承自 Spam 类,并且在 Spam 类的构造函数中调用了 count 方法,因此 Spam.num_instane 进一步增加了 2,此时 Spam.num_instane 等于 3。
  5. 创建 z1z2 和 z3 时,它们是 Other 类的实例,同样继承自 Spam 类,因此也会调用 Spam 类的构造函数,并且 Spam.num_instane 再增加 3,此时 Spam.num_instane 等于 6。
  6. Sub.num_instane 和 Other.num_instane 在各自的类中被重置为 0,但它们没有在任何实例化过程中被调用,因此它们的值始终为 0。

所以,最终打印出的结果是 Spam.num_instane 的值为 6,y1.num_instane 和 z1.num_instane 都是 0,因为它们是 Sub 和 Other 类的实例,而它们的类变量 num_instane 在创建实例时并没有被修改。最后打印出的 Spam.num_instaneSub.num_instane 和 Other.num_instane 都是 6、0 和 0。

————————————————————————————————————————————————————————————————————————————————————————————————

这段代码定义了一个基类 Spam 和两个继承自 Spam 的子类 Sub 和 Other。每个类都有一个类变量 num_instane,用于记录该类的实例数量。Spam 类还定义了一个静态方法 count,用于增加 Spam.num_instane 的值。

让我们逐步分析一下代码的执行过程:

  1. 创建 Spam 类的一个实例 x。在 Spam 的构造函数中,会调用 self.count(),这将增加 Spam.num_instane 的值。此时 Spam.num_instane 变为 1。

  2. 创建 Sub 类的两个实例 y1 和 y2。由于 Sub 没有重写构造函数,它会隐式调用基类 Spam 的构造函数。这意味着 Spam.count() 会被调用两次,每次调用都会增加 Spam.num_instane 的值。此时 Spam.num_instane 变为 3。

  3. 创建 Other 类的三个实例 z1z2 和 z3。同样地,Other 没有重写构造函数,所以它也会隐式调用基类 Spam 的构造函数。这将导致 Spam.count() 再次被调用三次,每次调用都会增加 Spam.num_instane 的值。此时 Spam.num_instane 变为 6。

  4. 打印 x.num_instaney1.num_instane 和 z1.num_instane 的值。由于 Spam 的构造函数被调用了六次,Spam.num_instane 为 6。但是,Sub 和 Other 的构造函数中没有增加 Sub.num_instane 和 Other.num_instane 的值,因此它们分别保持为 0。

  5. 打印 Spam.num_instaneSub.num_instane 和 Other.num_instane 的值。由于 Spam 的构造函数被调用了六次,Spam.num_instane 为 6。Sub 和 Other 的构造函数没有改变它们各自的 num_instane 值,因此它们都是 0。

所以,最终打印的结果应该是:

plaintext

Copy

6 0 0
6 0 0

——————————————————————————————————————————————————————————

这段代码的执行过程,涉及了面向对象编程中的一些核心概念,如类变量、实例变量、继承、构造函数以及静态方法等。下面,我将详细解析这些概念以及它们是如何在代码中发挥作用的。

  1. 类变量和实例变量

    • 类变量是属于类的变量,它被该类的所有实例共享。在代码中,count就是一个类变量,它记录了类的实例数量。
    • 实例变量是属于类实例的变量,每个实例都有自己独立的实例变量。在本例中,虽然代码没有明确说明,但可以假设每个类实例可能有自己的实例变量。
  2. 继承

    • 继承是一种机制,允许一个类(子类)继承另一个类(基类)的属性和方法。在代码中,ChildAChildB类继承自Base类。
  3. 构造函数

    • 构造函数是一个特殊的方法,当创建类的新实例时会被自动调用。在 Python 中,构造函数是__init__方法。当创建Base类的实例时,会自动调用Base的构造函数。同理,创建ChildAChildB类的实例时,会自动调用它们各自的构造函数。
  4. 静态方法

    • 静态方法是属于类的方法,不需要类的实例即可调用。在代码中,increase_count是一个静态方法,它被用来增加count类变量的值。

现在,让我们根据代码执行的顺序来更深入地分析:

  1. 创建Base类的一个实例base_instance

    • __init__方法被调用,Base类的count增加 1,因此Base.count变为 1。
  2. 创建ChildA类的两个实例childA1childA2

    • 由于ChildA没有重写__init__方法,它会隐式调用基类Base的构造函数。
    • 因此,Base类的count再次被调用两次,每次调用都会增加 1。
    • 此时Base.count变为 3。
  3. 创建ChildB类的三个实例childB1childB2childB3

    • 同样地,ChildB没有重写__init__方法,所以它也会隐式调用基类Base的构造函数。
    • 这将导致Base.count再次被调用三次,每次调用都会增加 1。
    • 此时Base.count变为 6。
  4. 打印ChildA.countChildB.countBase.count的值:

    • ChildA.countChildB.count的值为 0,因为这两个类的构造函数都没有增加它们各自类变量的值。
    • Base.count的值为 6,因为Base类的构造函数被调用了六次。

通过这个分析,我们可以看到类变量和静态方法在继承结构中的行为,以及它们是如何影响类及其子类实例的创建过程的。希望这样详尽的解析能够帮助你更好地理解这些面向对象编程中的概念。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/913173.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下进程链接结构,命令行参数,环境变量

bash 是一种 shell。在 Linux 系统中,当我们在终端输入命令时,通常是在一个 shell 环境下进行的。如果这个 shell 是 bash,那么所有命令行执行的命令都是 bash 的子进程。 1.Linux下进程链接结构 进程链接补充知识: 所有进程都…

FPGA实现串口升级及MultiBoot(八)四样错误实例演示

本文目录索引 一个指令和三种方式二种位流和四样错误Golden位流工程Watchdog的原理1、打开自己使用的Vivado版本的TCL SHELL2、进入multiboot_address_table.tcl 文件所在目录3、运行 multiboot_address_table.tcl 文件4、按照需求输入参数启动地址确定MultiBoot位流工程验证ex…

信息安全工程师(84)UNIX/Linux操作系统安全分析与防护

前言 UNIX/Linux操作系统,尤其是Linux,以其开放性、稳定性和安全性在服务器、桌面、嵌入式设备和超级计算机中占据重要地位。然而,没有任何操作系统可以百分之百地保证安全,UNIX/Linux也不例外。 一、UNIX/Linux操作系统安全分析 …

day08(单片机)时钟系统+定时器+PWM

目录 时钟系统定时器PWM 时钟系统 时钟基本概念 时钟源 晶体振荡器(Crystal Oscillator) RC振荡器(Resistor-Capacitor Oscillator) ​​​​​​​STM32U5时钟源 HSI(High Speed Internal) HSE(High Speed External) LSI(Low Spe…

【JavaEE初阶 — 多线程】内存可见性问题 volatile

1. 内存可见性问题 内存可见性的概念 什么是内存可见性问题呢? 当一个线程对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。在Java中,可以借助 synchronized、volatile 以及各种Lock 实现可见性。如果我们将变量声…

通用特效Shader

一、通用特效Shader介绍 1.1 什么是通用特效材质 Unity支持SRP Batcher后,使用UberShader的优势非常明显。所谓,UberShader,即一个超级Shader,覆盖一类功能,而不是多个分散的小Shader,比如一个通用特效Sh…

spark-本地模式的配置和简单使用

python环境的安装 在虚拟机中,只能安装一个python的版本,若想要安装别的版本,则需要卸载之前的版本——解决方式,安装Anaconda 通过百度网盘分享的文件:Anaconda3-2021.05-Linux-x86_64.sh 链接:https://…

分享三个python爬虫案例

一、爬取豆瓣电影排行榜Top250存储到Excel文件 近年来,Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序,用于抓取豆瓣电影Top250的相关信息,并将其保存为Excel文件。 获取网页数据的函数,包括以…

PyQt5 详细安装与配置教程及使用

文章目录 Part1:安装 PyQt5Part2:配置 PyQt5 的依赖工具 QtDesigner 和 PyUICPart3:使用QtDesigner设计界面Part4:使用PyUIC将设计好的界面转换为.py文件Part5:通过代码显示ui界面 Part1:安装 PyQt5 需要安…

ssm079基于SSM框架云趣科技客户管理系统+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:客户管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本客户管理系统就是在这…

C语言 | Leetcode C语言题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; int nextGreaterElement(int n){int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 % 10 < targetDigit; x2…

华为大变革?仓颉编程语言会代替ArkTS吗?

在华为鸿蒙生态系统中&#xff0c;编程语言的选择一直是开发者关注的焦点。近期&#xff0c;华为推出了自研的通用编程语言——仓颉编程语言&#xff0c;这引发了关于仓颉是否会取代ArkTS的讨论。本文将从多个角度分析这两种语言的特点、应用场景及未来趋势&#xff0c;探讨仓颉…

Linux:基本开发工具

一&#xff1a;编辑器vim 1.1vim的基本概念 vim其实有多重模式&#xff0c;这里我们主要了解vim的三种模式&#xff0c;分别是命令模式&#xff08;command mode&#xff09;,插入模式(Insert mode)和底行模式(lst line mode) 正常/普通/命令模式(Normal mode) …

第14张 GROUP BY 分组

一、分组功能介绍 使用group by关键字通过某个字段进行分组&#xff0c;对分完组的数据分别 “SELECT 聚合函数”查询结果。 1.1 语法 SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column]; 明确&#…

TVM计算图分割--BYOC框架

文章目录 BYOC架构算子标注单算子标注复合算子标注Cost-based PartitionCodegenCodegen for C代码生成流程概览代码生成工程实现实现CodegenC实现CSourceCodegenCodegen for JSON实现JsonCodegenRuntimeJSONRuntime参考随着后端设备数量激增,为达到较高的效果在这些设备上,对…

计算机毕业设计Python+卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

qt QShortcut详解

1、概述 QShortcut是Qt框架中的一个类&#xff0c;它提供了一种创建键盘快捷键的方式。通过QShortcut&#xff0c;开发者可以将特定的键盘组合&#xff08;如CtrlC、AltF4等&#xff09;与应用程序中的动作&#xff08;如复制、关闭窗口等&#xff09;关联起来。当用户在应用程…

C++OJ_二叉树的层序遍历

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C_OJ 小伞的主页&#xff1a;xiaosan_blog 二叉树的层序遍历 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff0…

The Rank-then-Encipher Approach

原始观点 Format-Preserving Encryption 4 The Rank-then-Encipher Approach 引用1 Hybrid diffusion-based visual image encryption for secure cloud storage 2.2 Sum-preserving encryption Bellare introduced the concept of format-preserving encryption (FPE)…

DolphinDB 与南方科技大学联合授课啦!

11月1日&#xff0c;南方科技大学商学院和 DolphinDB 联合举办了高校课程讲座。讲座由南方科技大学商学院高级研究学者冯鹏举主持&#xff0c;DolphinDB 创始人兼 CEO 周小华博士、某百亿私募数据平台架构师潜蛟老师进行精彩演讲。 Part 1 : 大数据时代下数据库架构革新与生态…