news 2026/5/13 7:22:26

除了直接通过类名修改类变量,还有哪些方式可以修改类变量?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
除了直接通过类名修改类变量,还有哪些方式可以修改类变量?

你想知道除了直接通过类名修改类变量之外的其他可行方式,以下是多种实用方法,涵盖不同场景,附原理和完整可运行示例:

一、通过实例间接操作类(绕过实例命名空间,不创建实例变量)

这类方法的核心是通过实例获取所属类,再修改类变量,不会在实例中创建同名实例变量。

1. 通过实例的__class__属性
原理

每个 Python 实例都内置__class__属性,直接指向其所属的类,通过实例.__class__.类变量可直接操作类命名空间,修改类变量本身。

示例

python

运行

class Product: default_price = 99 # 类变量 # 创建实例 phone = Product() # 通过 __class__ 修改类变量 phone.__class__.default_price = 199 # 验证结果 print(Product.default_price) # 输出:199 print(phone.default_price) # 输出:199 print("default_price" in phone.__dict__) # 输出:False(无实例变量)
2. 通过type(实例)函数
原理

type(obj)会返回实例obj所属的类,效果与实例.__class__完全一致,是更符合 Python 风格的写法,修改后同样不会创建实例变量。

示例

python

运行

class Student: class_name = "高一(1)班" # 类变量 # 创建实例 stu = Student() # 通过 type(实例) 修改类变量 type(stu).class_name = "高二(2)班" # 验证结果 print(Student.class_name) # 输出:高二(2)班 print(stu.class_name) # 输出:高二(2)班 print("class_name" in stu.__dict__) # 输出:False(无实例变量)

二、在类的实例方法 / 类方法中修改

1. 实例方法中使用super()函数(适用于继承场景)
原理

super()可获取当前实例的父类对象(无显式父类时默认是object),在实例方法内部通过super()可间接修改当前类或父类的类变量,操作的是类命名空间。

示例

python

运行

# 父类 class Person: species = "人类" # 父类类变量 # 子类 class Teacher(Person): subject = "语文" # 子类类变量 def modify_class_vars(self): # 修改子类类变量 super().subject = "数学" # 修改父类类变量 super().species = "智人" # 创建实例并调用方法 teacher = Teacher() teacher.modify_class_vars() # 验证结果 print(Teacher.subject) # 输出:数学 print(Person.species) # 输出:智人 print("subject" in teacher.__dict__) # 输出:False
2. 类方法中通过cls参数修改(推荐,专门用于操作类属性)
原理

类方法通过@classmethod装饰器定义,第一个参数cls直接指向类本身,通过cls.类变量可便捷修改类变量,无需额外获取类。

示例

python

运行

class Book: title = "Python 入门" # 类变量 @classmethod def modify_title(cls, new_title): # cls 就是 Book 类本身,修改类变量 cls.title = new_title # 调用类方法修改类变量(可通过类名或实例调用) Book.modify_title("Python 进阶实战") # 或 book = Book(); book.modify_title("Python 进阶实战") # 验证结果 print(Book.title) # 输出:Python 进阶实战

三、操作类的属性字典(直接修改类的命名空间)

1. 使用vars()函数
原理

vars(类)会返回类的属性字典(存储类变量等类属性),直接修改该字典中对应类变量的键值对,等同于修改类变量本身。

示例

python

运行

class Cart: goods = ["苹果", "香蕉"] # 类变量 # 通过 vars() 修改类变量 vars(Cart)["goods"] = ["苹果", "橙子", "西瓜"] # 也可修改可变类型内部元素 vars(Cart)["goods"].append("葡萄") # 验证结果 print(Cart.goods) # 输出:['苹果', '橙子', '西瓜', '葡萄']
2. 直接操作类的__dict__属性
原理

类本身也有__dict__属性,存储其命名空间信息,直接通过类.__dict__["类变量"]可修改类变量(注意:部分内置类型不支持直接修改__dict__,自定义类均可)。

示例

python

运行

class Course: student_num = 30 # 类变量 # 直接修改类的 __dict__ Course.__dict__["student_num"] = 45 # 验证结果 print(Course.student_num) # 输出:45

四、特殊场景:可变类型类变量的内部修改

原理

对于列表、字典、集合等可变类型的类变量,直接通过实例.类变量.方法()(如append()update())修改其内部元素时,操作的是类变量的引用对象本身,不会创建实例变量,本质上直接修改了类变量(仅适用于 “修改内部元素”,不适用于 “重新赋值”)。

示例

python

运行

class Group: members = ["张三", "李四"] # 可变类型类变量 # 创建实例 group1 = Group() group2 = Group() # 直接修改可变类变量内部元素,无需额外操作类 group1.members.append("王五") group1.members.remove("李四") # 验证结果:所有实例和类共享修改后的值 print(Group.members) # 输出:['张三', '王五'] print(group2.members) # 输出:['张三', '王五'] print("members" in group1.__dict__) # 输出:False(无实例变量)

总结

除直接通过类名修改外,核心修改类变量的方式可归纳为 4 类:

  1. 实例间接操作类实例.__class__.类变量type(实例).类变量(不创建实例变量);
  2. 类 / 实例方法内操作super()(继承场景)、@classmethod装饰器 +cls参数(推荐操作类属性);
  3. 操作类的属性字典vars(类)["类变量"]类.__dict__["类变量"](直接修改类命名空间);
  4. 可变类型类变量内部修改实例.类变量.append()等(仅适用于修改内部元素,非重新赋值)。

所有方法的核心共性是操作类的命名空间,而非实例的命名空间(可变类型内部修改除外,本质是操作共享引用对象)。

https://avg.163.com/topic/detail/8254662
https://avg.163.com/topic/detail/8254690
https://avg.163.com/topic/detail/8254709
https://avg.163.com/topic/detail/8254732
https://avg.163.com/topic/detail/8254660
https://avg.163.com/topic/detail/8254691
https://avg.163.com/topic/detail/8254710
https://avg.163.com/topic/detail/8254661
https://avg.163.com/topic/detail/8254663
https://avg.163.com/topic/detail/8254692
https://avg.163.com/topic/detail/8254616
https://avg.163.com/topic/detail/8254615
https://avg.163.com/topic/detail/8254711
https://avg.163.com/topic/detail/8254659
https://avg.163.com/topic/detail/8254657
https://avg.163.com/topic/detail/8254733
https://avg.163.com/topic/detail/8254689
https://avg.163.com/topic/detail/8254686
https://avg.163.com/topic/detail/8254693
https://avg.163.com/topic/detail/8254734
https://avg.163.com/topic/detail/8254614
https://avg.163.com/topic/detail/8254735
https://avg.163.com/topic/detail/8254707
https://avg.163.com/topic/detail/8254704
https://avg.163.com/topic/detail/8254731
https://avg.163.com/topic/detail/8254726
https://avg.163.com/topic/detail/8254656
https://avg.163.com/topic/detail/8254687
https://avg.163.com/topic/detail/8254705
https://avg.163.com/topic/detail/8254730
https://avg.163.com/topic/detail/8254613
https://avg.163.com/topic/detail/8254658
https://avg.163.com/topic/detail/8254688
https://avg.163.com/topic/detail/8254706
https://avg.163.com/topic/detail/8254729
https://avg.163.com/topic/detail/8254612
https://avg.163.com/topic/detail/8254655
https://avg.163.com/topic/detail/8254685
https://avg.163.com/topic/detail/8254702
https://avg.163.com/topic/detail/8254728
https://avg.163.com/topic/detail/8254611
https://avg.163.com/topic/detail/8254654
https://avg.163.com/topic/detail/8254684
https://avg.163.com/topic/detail/8254703
https://avg.163.com/topic/detail/8254727

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 22:17:24

【Open-AutoGLM智能体电脑性能实测】:9项关键指标碾压传统PC的真相

第一章:Open-AutoGLM智能体电脑性能实测概述Open-AutoGLM 是新一代基于 AutoGLM 架构的智能体系统,专为复杂任务自动化与自然语言理解优化设计。本实测旨在评估其在典型硬件配置下的运行效率、响应延迟与资源占用表现,覆盖从启动初始化到多轮…

作者头像 李华
网站建设 2026/5/11 13:10:38

基于文档敏感等级实施分级访问控制机制

基于文档敏感等级实施分级访问控制机制 在企业日益依赖大语言模型(LLM)进行知识管理和智能问答的今天,一个尖锐的问题摆在面前:如何让AI既足够聪明,又能守住数据安全的底线? 设想这样一个场景:一…

作者头像 李华
网站建设 2026/4/25 10:25:57

39、PowerShell社区扩展实用指南

PowerShell社区扩展实用指南 PowerShell社区扩展(PSCX)为PowerShell增添了许多实用功能,下面将详细介绍其各项特性及使用方法。 1. 路径切换命令优化 在PowerShell中, cd 命令后的空格可以安全省略,以下是一些示例: PS> cd\ C:\ PS> cd users\hristo C:\use…

作者头像 李华
网站建设 2026/5/8 18:18:15

41、PowerShell 扩展与事件处理实用指南

PowerShell 扩展与事件处理实用指南 1. PowerShell 社区扩展(PSCX)概述 PowerShell 社区扩展(PSCX)是一个积累了大量实用功能的项目。它的强大之处在于收集社区中人们用于解决实际问题的代码,当你遇到类似问题时,这些代码可能会对你有所帮助。而且,PSCX 非常全面,只需…

作者头像 李华