python-当调用对象成员的时候,会和对象本身动态关联

2024-03-20 21:04

本文主要是介绍python-当调用对象成员的时候,会和对象本身动态关联,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们用代码来解释这个结论

我们先来看一个基础的代码。 

class A:i = 10def sum(self):return self.getI() + 10def sum1(self):return self.i + 10def getI(self):return self.iclass B(A):i = 20def sum(self):return self.i + 20def getI(self):return self.idef sum1(self):return self.i + 10b = B()
print(b.sum()) # 40
print(b.sum1()) # 30

        我们将类B()实例化,创建一个对象b,调用该对象的sum方法,由于类B()中含有sum方法,则直接调用即可,该行代码输出40。同理,B类中也存在sum1方法,则直接调用即可,返回30。

 将上面的代码中B类的sum方法和sum1方法删掉,如下所示,那么程序会输出什么呢?

class A:i = 10def sum(self):return self.getI() + 10def sum1(self):return self.i + 10def getI(self):return self.iclass B(A):i = 20def getI(self):return self.ib = B()
print(b.sum()) # 30
print(b.sum1()) # 30

        同样,b对象调用B类中的sum方法,由于B类中没有sum方法,但又因为B类与A类构成继承关系,且A类中有sum方法,因此在执行b.sum()时会调用A类中的sum方法,A类中的sum方法返回的是 self.getI()+10,由于A类、B类中都存在getI()方法,那么此时,调用的是哪个类中的 getI() 方法呢?这就引出了我们的结论:当调用对象成员的时候,会和对象本身动态关联,它调用哪个类中的getI()方法,主要取决于self是哪个类型,那么我们就可以知道,此时这个self表示的就是B类这个类型,因此调用的这个getI()方法就是B类中的getI()方法,那么此时会返回30。
        同理可分析第二个print语句。

我们使用PyCharm来验证一下我们的猜想

在第一个print语句处打上断点,即第21行语句,我们开始进行Debug。 

程序迅速执行到第20行处停止,如下图所示。接下来我们按下Step Into按键进行逐步调试。 

 我们可以看到程序迅速跳转到第四行,准备执行A类中的sum方法,这与我们前面设想的一致

 并且我们清晰的可以看到,此时的self类型是B类型。

接下来,我们再次进行Step Into,我们可以看到程序跳入到B类中的getI方法。如下图所示。这与我们在前面的猜想一致。

 经过验证,我们的猜想是正确的。

这篇关于python-当调用对象成员的时候,会和对象本身动态关联的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830711

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker