news 2026/3/3 2:28:26

除了通过实例的__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/2/28 7:59:29

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

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

作者头像 李华
网站建设 2026/2/27 13:09:24

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

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

作者头像 李华
网站建设 2026/3/1 0:07:34

39、PowerShell社区扩展实用指南

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

作者头像 李华
网站建设 2026/2/26 1:16:06

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

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

作者头像 李华
网站建设 2026/3/3 11:09:38

揭秘Open-AutoGLM底层架构:如何实现零代码大模型微调与部署

第一章:揭秘Open-AutoGLM底层架构:如何实现零代码大模型微调与部署 Open-AutoGLM 是一个面向大语言模型(LLM)的自动化微调与部署框架,其核心目标是让开发者无需编写代码即可完成从数据准备到模型上线的全流程。该系统通…

作者头像 李华