当前位置: 首页 > article >正文

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类的构造函数被调用了六次。

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

 


http://www.kler.cn/a/388311.html

相关文章:

  • Oracle 数据库执行计划的查看与分析技巧
  • java相关学习文档或网站整理
  • 打破视障壁垒,百度文心快码无障碍版本助力视障IT从业者就业无“碍”
  • 设计模式-创建型-工厂方法模式
  • OpenStack系列第三篇:CentOS7 上部署 OpenStack(Train版)集群教程 Ⅲ Nova Neutron 服务部署
  • MetaRename for Mac,适用于 Mac 的文件批量重命名工具
  • 9. 基于 Redis 实现排行榜功能
  • jenkins提交gitee后自动部署
  • 小程序源码-模版 100多套小程序(附源码)
  • dolphin 配置data 从文件导入hive 实践(一)
  • 【Rust实现命令模式】
  • java---认识异常(详解)
  • 游戏引擎学习第三天
  • 2025 年使用 Python 和 Go 解决 Cloudflare 问题
  • 编程语言哪家强?对比C,C++,Java等语言的区别
  • 3DGS与NeRF的区别
  • 爬虫学习8
  • 【Promise】自定义promise
  • 机器学习Housing数据集
  • Android Studio 将项目打包成apk文件
  • Mac打开time machine(时间机器)备份特殊文件
  • ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver(二)
  • DataFrame
  • Spring高手之路26——全方位掌握事务监听器
  • 第02章 CentOS基本操作
  • 腾讯云服务器到期网站迁移到新服务器参考指南