Python--案例练习

 

 

案例:

class Spam(object):num_instane = 0@staticmethoddef count():Spam.num_instane += 1def __init__(self):self.count()class Sub(Spam):num_instane = 0class Other(Spam):num_instane = 0x = 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类的构造函数被调用了六次。

 

通过这个分析,可以看到类变量和静态方法在继承结构中的行为,以及它们是如何影响类及其子类实例的创建过程的。

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】任务十:从函数分析到机器学习应用与BP神经网络

目录 1.从函数分析到机器学习应用 1.1 3D曲面图可视化报告 1.1.1 目标 1.1.2 代码分析 1.1.3 结果分析 1.1.4 观察与总结 1.1.5 结论 1.2 一元函数梯度计算报告 1.2.1 目标 1.2.2 代码分析 1.2.4 计算结果 1.2.5 优势与意义 1.2.6 结论 1.3 一元函数梯度和二阶导…

ios打包文件上传App Store windows工具

在苹果开发者中心上架IOS APP的时候,在苹果开发者中心不能直接上传打包文件,需要下载mac的xcode这些工具进行上传,但这些工具无法安装在windows或linux电脑上。 这里,我们可以不用xcode这些工具来上传,可以用国内的香…

Rust @绑定(Rust@绑定)(在模式匹配的同时将值绑定到变量)

文章目录 Rust中的绑定基础概念示例:基本模式匹配 绑定的使用示例:范围匹配并绑定变量 深入探索绑定的好处示例:复杂数据结构中的应用 总结 附加 Rust中的绑定 Rust 语言以其强类型系统和内存安全的特性著称。在进行模式匹配时,R…

JVM知识点大全(未完...)

JVM运行时数据区域 堆 堆是Java虚拟机中用于存储对象的主要区域,包括字符串常量池。绝大多数对象都是在堆中创建的(少部分对象可能会在栈上分配)。为了更好地进行垃圾回收,堆被划分为年轻代和老年代两部分。年轻代又被进一步分为E…

Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP

1.安装lua 1.1安装LuaJIT yum install readline-devel mkdir -p lua-file cd lua-file/ wget https://github.com/LuaJIT/LuaJIT/archive/refs/tags/v2.0.5.tar.gz tar -zxvf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make && make install PREFIX/usr/local/luajit 1.2…

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测 目录 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预…

Java - SpringBoot之logback设置日期分割并设置指定时间自动清除,Linux启动运行

一、SpringBoot之logback-spring.xml配置 在Spring Boot中,要设置日志按照日期进行分割输出,并设置日志文件的大小自动清除,可以使用logback日志框架的配置 1、创建文件 在项目的resources目录下,创建logback-spring.xml文件 …

window11安装elasticsearch+Kibana

1、下载elasticsearch与elasticsearch 下载elasticsearch 查看elasticsearch对应的Kibana版本 下载elasticsearch解压后文件目录如下 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等 bin配置文件目录,如elasticsearch配置、角色配置、jvm配置等 conf 默认…

【HCIP园区网综合拓扑实验】配置步骤与详解(已施工完毕)

一、实验要求 实验拓扑图如上图所示 1、按照图示的VLAN及IP地址需求,完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan(本实验未使用) 4、上层…

【基于PSINS工具箱】以速度为观测量的SINS/GNSS组合导航,UKF滤波

基于【PSINS工具箱】,提供一个MATLAB例程,仅以速度为观测量的SINS/GNSS组合导航(滤波方式为UKF) 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码教程:使用UKF进行速度观测1. 引言与基本设置2. 初始设置3. U…

java访问华为网管软件iMaster NCE的北向接口时传递参数问题

上一篇文章介绍了利用《java访问华为网管软件iMaster NCE的北向接口》的一般性步骤,这里详细介绍其中一个读取性能数据的示例。原因是读取华为网管软件北向接口,完全找不到可供参考的例子。如果不需要传递什么参数,就能获取到结果&#xff0c…

基于SpringBoot的“在线考试系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“在线考试系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统登录界面图 用户注册界面图 管…

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

科大讯飞面经,蛮简单的

先来看面经: 下面我来简单聊聊这些问题。 自我介绍 关于如何自我介绍,这个如果还不会或者还没有准备,请先准备好你要如何向面试官介绍自己。 面试本来就是一个自我推销的方式之一,如果自我介绍都不会说,你如何卖个好价…

首次超越扩散模型和非自回归Transformer模型!字节开源RAR:自回归生成最新SOTA!

文章链接:https://arxiv.org/pdf/2411.00776 项目链接:https://yucornetto.github.io/projects/rar.html 代码&模型链接:https://github.com/bytedance/1d-tokenizer 亮点直击 RAR(随机排列自回归训练策略)&#x…

通义千问API调用测试 (colab-python,vue)

文章目录 代码(来自官网)colab中用python测试Qwen2.5在官网上查看并确定过期时间这里看到我的免费额度到25年5月在同一个页面,点击API示例 前端调用直接在前端调用的优缺点以vue为例(代码是基于官网node.js的代码转换而来&#xf…

立体工业相机提升工业自动化中的立体深度感知

深度感知对仓库机器人应用至关重要,尤其是在自主导航、物品拾取与放置、库存管理等方面。 通过将深度感知与各种类型的3D数据(如体积数据、点云、纹理等)相结合,仓库机器人可以在错综复杂环境中实现自主导航,物品检测…

LSTM+LightGBM+Catboost的stacking融合模型

基本介绍 针对目前大部分数据同时具有特征连续和特征不连续的特点,将神经网络模型如LSTM和回归树模型如XGboost,基于stacking集成学习原理进行融合 附有模型评价指标R2、RMSE、MAE、MSE,代码包含注释,可以直接运行。 融合过程 在机器学习中…

人工智能 | 文生视频大模型

简介 文生视频指的是将文本描述转化为视频内容的技术,2024年2月15日 OpenAI 正式对外发布 Sora 人工智能模型,在人工智能领域掀起了一场风波,这是计算机视觉领域的一个突破。 Sora 这一名称起源于日文中“空”的含义,暗示了其具…

测试实项中的偶必现难测bug--一键登录失败

问题描述:安卓和ios有出现部分一键登录失败的场景,由于场景比较极端,衍生了很多不好评估的情况。 产生原因分析: 目前有解决过多次这种行为的问题,每次的产生原因都有所不同,这边根据我个人测试和收集复现的情况列举一些我碰到的: 1、由于我们调用的是友盟的一键登录的…