news 2026/7/15 5:42:03

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

作者头像

张小明

前端开发工程师

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/7/10 5:01:26

Open-AutoGLM部署避坑指南:3大关键步骤决定你能否成功运行

第一章:Open-AutoGLM部署前的环境准备与认知 在部署 Open-AutoGLM 之前,充分理解其运行依赖和系统要求是确保后续流程顺利的关键。该框架基于 PyTorch 构建,依赖 CUDA 加速进行高效推理,因此需提前配置兼容的硬件与软件环境。 系…

作者头像 李华
网站建设 2026/7/13 19:59:09

做1688批发系统5年,被商品详情API坑到连夜改代码的实战手记

在电商开发圈混了快十年,1688的商品详情API绝对是最“特立独行”的存在。作为批发平台,它的接口返回里藏着太多零售平台没有的“暗门”——从阶梯价的诡异格式到混批规则的嵌套逻辑,每次对接都像拆盲盒。今天就把这些年踩过的坑、攒的实战代码…

作者头像 李华
网站建设 2026/7/1 12:30:37

结合Jupyter Notebook实现数据科学问答分析

结合 Jupyter Notebook 实现数据科学问答分析 在企业数据分析实践中,一个老生常谈的问题是:业务人员有明确的分析需求,却无法直接操作数据;而数据团队忙于响应各类临时查询,疲于奔命。更糟糕的是,每次分析结…

作者头像 李华
网站建设 2026/7/14 20:11:15

【AI模型部署新突破】:为什么顶级开发者都在用Win+Open-AutoGLM组合?

第一章:WinOpen-AutoGLM组合的崛起背景近年来,人工智能与自动化技术的深度融合推动了新一代智能工作流系统的诞生。其中,“WinOpen-AutoGLM”组合因其在Windows平台上的高效集成能力、开源生态的灵活扩展性以及AutoGLM驱动的自然语言自动化执…

作者头像 李华
网站建设 2026/7/1 13:22:19

anything-llm前端界面体验报告:美观与实用兼备的设计理念

AnythingLLM前端界面体验报告:美观与实用兼备的设计理念 在大语言模型(LLM)技术席卷各行各业的今天,一个尖锐的问题浮出水面:我们是否真的需要每个人都成为AI工程师才能用好这些强大的工具?显然不是。越来越…

作者头像 李华
网站建设 2026/7/1 13:19:26

如何加强对客户选择华为云国际站代理商CloudDC专区的保障?

加强客户选择华为云国际站代理商 CloudDC 专区的保障,核心是构建 “资质 - 技术 - 服务 - 合规 - 成本 - 应急” 的全链路闭环,叠加代理商专属权益与落地兜底,用可量化的 SLA 与可执行的保障动作打消客户顾虑,提升决策确定性。以下…

作者头像 李华