news 2026/5/1 1:22:10

除了通过实例的__class__属性和type(实例),还有哪些方式可以在不创建实例变量的情况下修改类变量?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
除了通过实例的__class__属性和type(实例),还有哪些方式可以在不创建实例变量的情况下修改类变量?

你想知道除了实例.__class__type(实例)之外,能在不创建实例变量的情况下修改类变量的其他方式,以下是几种实用且核心的方法,涵盖不同使用场景,附详细原理和可运行示例:

一、直接通过类名修改(最原生推荐,优先选择)

原理

类变量本质属于类本身,而非实例。直接通过类名.类变量 = 新值修改,是最根本、最直接的方式,完全绕开实例的命名空间,自然不会在任何实例中创建同名实例变量,也是 Python 官方推荐的修改类变量的首选方案。

示例

python

运行

class Student: # 类变量:所有学生共享的班级名称和人数 class_name = "高一(1)班" student_num = 45 # 创建实例(仅用于验证修改效果,修改操作不依赖实例) stu1 = Student() stu2 = Student() # 直接通过类名修改类变量 Student.class_name = "高二(2)班" Student.student_num = 50 # 验证结果:所有实例和类都获取到修改后的值 print(stu1.class_name) # 输出:高二(2)班 print(stu2.class_name) # 输出:高二(2)班 print(Student.student_num) # 输出:50 # 验证:实例未创建新的实例变量(__dict__ 是实例的属性字典) print("class_name" in stu1.__dict__) # 输出:False print("student_num" in stu1.__dict__) # 输出:False

二、在实例方法中使用super()函数(适用于继承场景)

原理

super()函数用于获取当前实例对应的父类对象(若类没有显式指定父类,默认父类是object)。在类的实例方法内部,通过super()可以间接访问并修改当前类或父类的类变量,操作的是类的命名空间,不会在实例中创建新属性。

示例

python

运行

# 父类 class Person: # 父类类变量:物种类型 species = "人类" # 子类 class Teacher(Person): # 子类类变量:教授科目 subject = "语文" def modify_class_vars(self): # 修改子类自身的类变量(通过 super() 间接操作) super().subject = "数学" # 修改父类的类变量(通过 super() 向上访问) super().species = "智人" # 创建子类实例 teacher = Teacher() # 调用实例方法修改类变量 teacher.modify_class_vars() # 验证结果 print(teacher.subject) # 输出:数学(子类类变量已修改) print(Teacher.subject) # 输出:数学 print(teacher.species) # 输出:智人(父类类变量已修改) print(Person.species) # 输出:智人 # 验证:实例未创建新变量 print("subject" in teacher.__dict__) # 输出:False print("species" in teacher.__dict__) # 输出:False

三、通过vars()函数操作类的属性字典

原理

vars(对象)会返回对象的属性字典(即命名空间字典),当传入的对象是类时,返回的是类的属性字典(存储了类变量等类属性)。直接修改该字典中对应类变量的键值对,等同于直接修改类变量,不会触发生实例变量的创建。

示例

python

运行

class Book: # 类变量:书名和书籍信息 title = "Python 入门教程" info = {"pages": 200, "price": 59} # 创建实例 book1 = Book() book2 = Book() # 方式1:直接传入类名操作类属性字典 vars(Book)["title"] = "Python 进阶实战" # 修改不可变类型类变量 vars(Book)["info"]["pages"] = 300 # 修改可变类型类变量内部元素 vars(Book)["info"] = {"pages": 350, "price": 79} # 可变类型类变量重新赋值 # 验证结果 print(book1.title) # 输出:Python 进阶实战 print(Book.title) # 输出:Python 进阶实战 print(book2.info) # 输出:{'pages': 350, 'price': 79} print(Book.info) # 输出:{'pages': 350, 'price': 79} # 方式2:在实例方法中结合类获取操作 class Book2: title = "Java 基础" def modify_title(self): # 通过 type(self) 获取类,再用 vars() 修改 vars(type(self))["title"] = "Java 高级编程" obj2 = Book2() obj2.modify_title() print(Book2.title) # 输出:Java 高级编程 # 验证:实例未创建新变量 print("title" in book1.__dict__) # 输出:False print("info" in book1.__dict__) # 输出:False

四、特殊场景:可变类型类变量的内部修改(无需额外获取类)

原理

对于列表、字典、集合等可变类型的类变量,直接通过实例.类变量.方法()(如append()update()add()等)修改其内部元素时,操作的是类变量对应的引用对象本身(实例只是借用了类变量的引用),不会在实例命名空间中创建新的实例变量,本质上直接修改了类变量。

示例

python

运行

class Cart: # 可变类型类变量:购物车商品列表和商品数量字典 goods = ["苹果", "香蕉"] goods_count = {"苹果": 2, "香蕉": 3} # 创建实例 cart1 = Cart() cart2 = Cart() # 直接通过实例修改可变类变量的内部元素,无需额外操作类 cart1.goods.append("橙子") # 列表添加元素 cart1.goods_count.update({"橙子": 1}) # 字典更新键值对 cart1.goods.remove("香蕉") # 列表删除元素 # 验证结果:类变量被修改,所有实例共享修改后的值 print(cart1.goods) # 输出:['苹果', '橙子'] print(Cart.goods) # 输出:['苹果', '橙子'] print(cart2.goods_count) # 输出:{'苹果': 2, '香蕉': 3, '橙子': 1} print(Cart.goods_count) # 输出:{'苹果': 2, '香蕉': 3, '橙子': 1} # 验证:实例未创建新的实例变量 print("goods" in cart1.__dict__) # 输出:False print("goods_count" in cart1.__dict__) # 输出:False # 注意:若对可变类变量重新赋值,会创建实例变量(需避免) cart1.goods = ["西瓜"] # 错误:创建实例变量,不会修改类变量 print(Cart.goods) # 输出:['苹果', '橙子'](类变量未变)

总结

实例.__class__type(实例)外,核心可行的方法及关键特点:

  1. 直接通过类名修改:最原生、高效,适用于已知类名的场景,是修改类变量的首选;
  2. super()函数:适用于类的实例方法内部,尤其适合继承场景下修改当前类或父类的类变量;
  3. vars()函数操作类属性字典:通过修改类的命名空间字典实现,灵活可控,支持批量或动态修改类变量;
  4. 可变类型类变量内部修改:仅适用于修改元素(非重新赋值),无需额外获取类,操作简洁。

所有方法的核心共性:绕过实例的命名空间,直接操作类的命名空间,因此不会在实例中创建新的实例变量。

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

开源大模型落地应用典范:anything-llm在企业中的实际价值

开源大模型落地应用典范:anything-llm在企业中的实际价值 在企业知识管理的日常中,你是否经历过这样的场景?新员工反复询问年假政策,HR每天重复回答相同问题;技术文档散落在Wiki、邮件和共享盘中,查找一个…

作者头像 李华
网站建设 2026/4/27 6:40:22

毕业设计 基于Astart的寻路算法设计与实现

文章目录 0 简介算法介绍广度优先搜索Dijkstra算法最佳优先搜索A*算法 启发函数关于距离曼哈顿距离对角距离欧几里得距离 算法实现坐标点与地图算法主体测试入口实现效果最后 0 简介 今天学长向大家分享一个毕业设计项目 毕业设计 基于Astart的寻路算法设计与实现 项目运行效…

作者头像 李华
网站建设 2026/4/27 22:37:35

好写作AI:学术语言教练,助你掌握更地道的学科表达

你是否曾收到这样的反馈:“表述不够专业”或“缺少学科味道”?学术写作不仅需要正确的语法,更需要符合特定学科社群的表达惯例。好写作AI全新角色——你的专属学术语言教练,将助你跨越这道隐形的专业门槛,掌握更地道、…

作者头像 李华
网站建设 2026/4/19 22:42:06

好写作AI:文献海洋导航员,快速梳理核心提炼研究立足点

面对成堆的PDF文献,你是否感到无从下手?下载了数十篇论文,却仍不清楚研究空白在哪里?好写作AI全新上线 “文献智能导航” 功能,化身你的专属研究导航员,助你在浩瀚文献中精准定位,快速提炼出真正…

作者头像 李华