Python里upper()方法怎么用?__dict__到底存了啥?点号访问属性背后发生了什么?

Python 中的 `upper()` 是一个**字符串对象的方法**,它的作用是返回一个将原字符串中所有小写字母转换为大写字母的新字符串。这是一个不会修改原字符串的纯函数式操作 [ref_1]。 `__dict__` 是 Python 对象的一个**内置属性**,它是一个字典(`dict`),用于存储该对象的**可写属性**(主要是实例属性)。它不是“头文件”,而是每个对象在运行时动态维护的一个命名空间。 当一个 Python 对象被创建后,其通过点语法(`.`)赋值或动态添加的属性,默认都会被存储在其自身的 `__dict__` 字典中 [ref_2]。例如: ```python class MyClass: class_attr = "I'm a class attribute" # 类属性,不存储在实例的__dict__中 def __init__(self, value): self.instance_attr = value # 实例属性,会存入__dict__ obj = MyClass(10) obj.dynamic_attr = "added later" # 动态添加的属性,也会存入__dict__ print(obj.__dict__) # 输出: {'instance_attr': 10, 'dynamic_attr': 'added later'} ``` 这个 `__dict__` 字典里存储的就是**键值对**,其中: * **键(Key)**:属性的名字(字符串),例如 `'instance_attr'`。 * **值(Value)**:该属性对应的值,可以是任何 Python 对象,例如 `10` 或 `"added later"`。 你提到的“一切皆对象”是 Python 的核心设计哲学。这意味着数字、字符串、函数、类、模块,甚至 `None`,都是某个“类”的“实例”。因为它们是对象,所以它们都有属性和方法,也就支持点语法访问。`__dict__` 就是这个哲学在存储层面的一个具体体现——大多数对象都靠这个字典来“记住”自己的状态 [ref_2]。 点语法 `obj.attribute` 的工作原理,本质上就是 Python 解释器在**查找**这个属性。这个过程可以简化为以下几步: 1. **实例查找**:解释器首先尝试在对象自己的 `__dict__` 里寻找键为 `'attribute'` 的项。 2. **类查找**:如果没找到,解释器会去对象的类(`obj.__class__`)的 `__dict__` 里寻找。 3. **继承链查找**:如果还没找到,解释器会沿着类的继承关系(父类、祖父类等)依次向上查找。 4. **特殊处理**:如果最终都没找到,且对象的类定义了 `__getattr__` 方法,则会调用这个方法作为最后的补救措施。 因此,当你写 `my_str.upper()` 时,Python 会先查找 `my_str` 这个字符串实例的 `__dict__`,发现没有 `upper` 这个键;然后去查找字符串类 `str` 的 `__dict__`,找到了 `upper` 这个方法对象,最后调用它。 你感到困惑的“为什么 `get` 会往字典里面添加数据”,这里需要澄清一个常见的误解。`dict.get(key)` **方法本身并不会向字典添加数据**。它的作用仅仅是**安全地获取**键对应的值。如果键存在,则返回值;如果键不存在,则返回 `None`(或你指定的默认值),但字典内容不变。 ```python my_dict = {'a': 1} value = my_dict.get('b') # 键'b'不存在 print(value) # 输出: None print(my_dict) # 输出: {'a': 1},字典没有变化 value_with_default = my_dict.get('b', 0) # 提供默认值0 print(value_with_default) # 输出: 0 print(my_dict) # 输出: {'a': 1},字典依然没有变化 ``` 你可能是将 `get()` 方法与**赋值操作**混淆了。**向字典添加数据**需要使用赋值语句 `dict[key] = value` 或者 `dict.update()` 等方法。 ```python my_dict = {'a': 1} my_dict['b'] = 2 # 这才是向字典添加键值对 print(my_dict) # 输出: {'a': 1, 'b': 2} ``` 总结一下核心机制: | 操作 | 语法 | 底层动作(简化) | 结果 | | :--- | :--- | :--- | :--- | | **读取属性** | `obj.x` | 在 `obj.__dict__` 中查找键 `'x'`,未找到则继续向上查找 | 返回找到的值或引发 `AttributeError` [ref_2] | | **设置属性** | `obj.x = 10` | 在 `obj.__dict__` 中添加或更新键值对 `{'x': 10}` | 属性被创建或修改 [ref_2] | | **调用方法** | `obj.method()` | 先按“读取属性”找到 `method` 这个函数对象,然后加上括号 `()` 调用它 | 执行方法内的代码 [ref_1] | | **字典取值** | `my_dict.get('key')` | 在字典的哈希表中查找键 `'key'` | 返回对应的值或默认值,**不修改字典** [ref_3] | | **字典赋值** | `my_dict['key'] = val` | 在字典的哈希表中插入或更新键 `'key'` 的条目 | 字典内容被改变 [ref_3] | 理解 `__dict__` 和属性查找链,是理解 Python 对象模型、点语法乃至面向对象编程的基础。它解释了为什么你可以动态地为对象添加属性,为什么方法需要 `self` 参数,以及继承是如何工作的。先从这些基础机制入手,再去看装饰器、元类等高级特性(语法糖),路径会更清晰。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

对python中字典keys,values,items的使用详解

对python中字典keys,values,items的使用详解

今天小编就为大家分享一篇对python中字典keys,values,items的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

python-常用方法.docx

python-常用方法.docx

python 常用方法 Python是一种高级编程语言,它具有简单易学、可读性强、功能强大等特点,因此在数据分析、人工智能、Web开发等领域得到了广泛应用。在Python中,有许多常用方法可以帮助我们更加高效地编写代码,下面就来介绍一些常用的Python方法。 1. 列表方法 列表是Python中最常用的数据类型之一,它可以存储多个元素。在Python中,有许多列表方法可以帮助我们更好地操作列表。例如,append()方法可以在列表末尾添加一个元素,extend()方法可以将一个列表中的元素添加到另一个列表中,sort()方法可以对列表进行排序等等。 2. 字符串方法 字符串是Python中另一个常用的数据类型,它可以存储文本信息。在Python中,有许多字符串方法可以帮助我们更好地操作字符串。例如,upper()方法可以将字符串中的所有字母转换为大写,lower()方法可以将字符串中的所有字母转换为小写,strip()方法可以去除字符串中的空格等等。 3. 字典方法 python-常用方法全文共2页,当前为第1页。 字典是Python中另一个常用的数据类型,它可以存储键值对。在Pyt

学学Python_字符串08_字典的方法01 clear方法

学学Python_字符串08_字典的方法01 clear方法

字典的clear方法。文章:https://blog.csdn.net/yysyangyangyangshan/article/details/82874872

python动态加载包的方法小结

python动态加载包的方法小结

主要介绍了python动态加载包的方法,结合实例形式总结分析了Python动态加载模块,动态增加属性及动态加载包的相关实现技巧,需要的朋友可以参考下

python连接mongodb集群方法详解

python连接mongodb集群方法详解

主要介绍了python连接mongo集群方法详解,需要的朋友可以参考下

深入解析Python中的__builtins__内建对象

深入解析Python中的__builtins__内建对象

__builtins__ 是内建模块__builtin__中的对象,使用Python中的内建函数时会通过__builtins__引导,这里我们就来深入解析Python中的__builtins__内建对象,需要的朋友可以参考下

Python中的__slots__示例详解

Python中的__slots__示例详解

在python新式类中,可以定义一个变量__slots__,它的作用是阻止在实例化类时为实例分配dict,下面这篇文章主要给大家介绍了关于Python中__slots__的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。

50道Python面试题集锦(附答案).pdf

50道Python面试题集锦(附答案).pdf

又是一年秋招季,50道python面试题集锦(附答案),pdf版可打印,亲测有效。

Python常用数据结构和公共方法技巧总结

Python常用数据结构和公共方法技巧总结

Python常用数据结构和公共方法技巧总结 目录 • 1. 列表 • 1.1 列表的定义 • 1.2 列表常用操作 • 1.3 循环遍历 • 1.4 应用场景 • 2. 元组 • 2.1 元组的定义 • 2.2 元组常用操作 • 2.3 循环遍历 • 2.4 应用场景 • 3. 字典 • 3.1 字典的定义 • 3.2 字典常用操作 • 3.3 循环遍历 • 3.4 应用场景 • 4. 字符串 • 4.1 字符串的定义 • 4.2 字符串的常用操作 • 1) 判断类型 • 2) 查找和替换 • 3) 大小写转换 • 4) 文本对齐 • 5) 去除空白字符 • 6) 拆分和连接 • 4.3 字符串的切片 • 4.4 字符串的格式化输出 • 5. 公共方法 • 5.1 Python 内置函数 • 5.2 切片 • 5.3 运算符 5.4 完整的 for 循环语法

python字典和json.dumps()的遇到的坑分析

python字典和json.dumps()的遇到的坑分析

最近项目中需要与管易云erp做对接,看了他的接口文档,php的示例代码,于是用python仿写。 其中传的参数data中前面几个json数据是固定的,最后需要加一个签名,该签名是对前面的json数据字符串化后,首尾拼接上screct字符串,再做md5处理(32位大写),再将该签名添加到之前的json中作为post参数传递过去。 问题就出在组装json字符串和签名中,因为python内置的字典是无序的,导致我组装好的json数据作为参数传递给自己编写的签名函数时,字典内部的顺序是变化的,所以签名前后的md5值不一样,导致频频报错,自己起初没在意数据顺序的事,因为对接金蝶erp时没有签名这一项,数

测量程序编制 - python 34数据类型:dict(字典)-创建(三).pptx

测量程序编制 - python 34数据类型:dict(字典)-创建(三).pptx

dict(字典)——推导式 Dictionary(字典)——推导式 字典推导式 语法:{key_expr:value_expr for value in collection if condition} 例一: 用字典推导式求一个字符串以及其长度 strs=['study','python','come','sirt'] dict1={key:len(key) for key in strs} print(dict1) {'study': 5, 'python': 6, 'come': 4, 'sirt': 4} Dictionary(字典)——推导式 字典推导式 例二: 不区分大小写,key一样的合并 mcase={'a':10,'b':34,'A':7,'Z':3} mcase_fre={key.lower():mcase.get(key.lower(),0)+mcase.get(key.upper(),0) for key in mcase if key in ['a','b']} print(mcase_fre) {'a': 17, 'b': 34} Dictionary(字典

Python模拟三级菜单效果

Python模拟三级菜单效果

主要为大家详细介绍了Python模拟三级菜单效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

python面试绝妙笔试题-答案.pdf

python面试绝妙笔试题-答案.pdf

pythhon面试宝典,专门使用面试的各种坑,文档是朋友面试的总结,阅读可能不是很顺眼,请耐心阅读。适合面试小白,帮忙你客户技术面试难关。

Python使用matplotlib绘制正弦和余弦曲线的方法示例

Python使用matplotlib绘制正弦和余弦曲线的方法示例

主要介绍了Python使用matplotlib绘制正弦和余弦曲线的方法,结合实例形式分析了Python调用matplotlib库进行图形绘制想具体操作技巧,需要的朋友可以参考下

秋招面试python很全的八股文总结

秋招面试python很全的八股文总结

亲身总结的python八股文适合秋招找算法、软件类工作的同学的面试经验

python二级考试试题.pdf

python二级考试试题.pdf

在数据管理技术发展过程中,文件系统与数据库系统的主要区别是: 以下关于程序设计语言的描述,错误的选项是: 以下关于字符串类型的操作的描述,错误的是:

Python实现仿射密码

Python实现仿射密码

仿射密码思路: 1、加解密公式: 2、构造对应字典: 3、代码实现 构造字典,建立映射关系: # 构造字典,'A' --> 0 ... def char_2_num(x): list_s = [] list_num = [] for i in range(26): c = chr(i + 65) list_s.append(c) list_num.append(i) c_2_n = dict(map(lambda x, y: [x, y], list_s, list_num)) return c_2_n[

python随机生成藏头诗

python随机生成藏头诗

使用字典来对txt文件中的诗句进行挑选,从而生成藏头诗(以对角线对齐的方式),同时可以输入4-7个字来随机生成。

Python 开发者常用的30个极简Python代码

Python 开发者常用的30个极简Python代码

学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则。 1 重复元素判定 2 字符元素组成判定 3 内存占用 4 字节占用 5 打印 N 次字符串 6 大写第一个字母 7 分块 8 压缩 9 解包 10 链式对比

python面试题(四).pdf

python面试题(四).pdf

python⾯试题(四) python⾯试题(四) 1、举例sort和sorted对列表排序,list=[0,-1,3,-10,5,9] 2、对list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],使⽤lambda函数从⼩到⼤排序 3、使⽤lambda函数对list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],输出结果为 [0,2,4,8,8,9,-2,-4,-4,-5,-20],正数从⼩到⼤,负数从⼤到⼩ (传两个条件,x<0和abs(x)) 4、列表嵌套字典的排序,分别根据年龄和姓名排序 foo = [{"name":"zs","age":19},{"name":"ll","age":54}, {"name":"wa","age":17},{"name":"df","age":23}] 5、列表嵌套元组,分别按字母和数字排序 6、列表嵌套列表排序,年龄数字相同怎么办? 7、根据键对字典排序(⽅法⼀,zip函数) 8、根据键对字典排序(⽅法⼆,不⽤zip) 有没有发现dic.items和zip(dic.keys(),dic.

最新推荐最新推荐

recommend-type

在Pycharm terminal中字体大小设置的方法

如下所示: file->settings->Editor->General->Console里面的console commands history size 以上这篇在Pycharm terminal中字体大小设置的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:PyCharm中代码字体大小调整方法Pycharm使用之设置代码字体大小和颜色主题的教程用Pycharm实现鼠标滚轮控制字体大小的方法pycharm 使用心得(二)设置字体大小Pycharm 字体大小调整设置的方法实现
recommend-type

PyCharm中代码字体大小调整方法

在本篇文章里小编给大家分享了关于PyCharm中代码字体大小调整方法以及相关知识点,需要的朋友们学习下。
recommend-type

PyCharm设置注释字体颜色以及是否倾斜的操作

如下所示: File–>Settings–>Editor–> Color Scheme–>Language Defaults–>Comments–>Line conmment Italic是是否倾斜。 Blod是否加粗。 Foreground是字体颜色。 Background背景色。 补充知识:Pycharm默认注释字体大小不一的解决方法 再使用Pycharm的过程中我们可能会发现注释的字体大小不一的情况; 注释中文字大小不一 因为个人习惯或是为了方便学习和工作我们会希望将其设置统一。以下为笔者使用过的方法。因为直接上手图片更加直观所以直接上图。 一、第一步 二、第二步 三、第三步
recommend-type

PyCharm更改字体和界面样式的方法步骤

主要介绍了PyCharm更改字体和界面样式的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

Pycharm 字体大小调整设置的方法实现

主要介绍了Pycharm 字体大小调整的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti