news 2026/6/15 15:26:43

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

作者头像

张小明

前端开发工程师

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/6/10 11:15:08

AI市场舆情分析哪家强?2025年度榜单,原圈科技领跑

摘要: 在AI市场舆情分析领域,哪家公司更值得推荐?基于技术能力、行业适配度与客户口碑等多个维度的综合评估,原圈科技被普遍视为头部代表。其通过深度融合企业内外数据,实现了从数据洞察到自动化策略生成的关键突破&am…

作者头像 李华
网站建设 2026/6/15 13:02:19

教育领域的新助手:学生也能轻松使用的anything-llm AI工具

教育领域的新助手:学生也能轻松使用的 Anything-LLM AI 工具 在今天的大学自习室里,一个学生正对着满屏的PDF讲义发愁——课程资料分散在十几个文件夹中,复习时找不到重点,提问又没人解答。如果能有一个懂这些材料、随时可以对话的…

作者头像 李华
网站建设 2026/6/15 13:02:11

收藏!35岁程序员转行大模型实录:2025年换道超车,告别中年危机

各位程序员兄弟、姐妹,如果你已过30岁,正被行业里热议的“中年危机”裹挟,对职业前路感到迷茫,甚至偶尔怀疑自己是否还能跟上技术迭代的节奏——那这篇来自35岁毅然转行大模型领域“过来人的分享”,你一定要看到最后。…

作者头像 李华
网站建设 2026/6/15 12:04:41

好写作AI:学术严谨性守护,文献引用与格式自动化校对

还在为一条条核对文献引用而焦虑?或是在投稿前夜,仍奋战于调整数百条参考文献的格式?别再把宝贵的时间,耗费在机械的“体力活”上。好写作AI,现已化身为你的“学术规范助手”,让自动化校对技术,…

作者头像 李华
网站建设 2026/6/15 12:03:47

好写作AI:克服写作拖延,72小时完成论文核心章节

面对Deadline步步紧逼,核心章节却仍是一片空白?拖延的焦虑与时间的压力,是否让你陷入“想写却写不出”的恶性循环?好写作AI深知这种困境,并为你设计了一套 “72小时高效冲刺方案” ,将庞大的写作任务拆解为…

作者头像 李华