news 2026/4/23 14:27: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/22 11:44:14

(9-3-02)智能编程助手(IDA Pro+VS Code+MCP):MCP-Plugin插件

(9)下面代码的功能是定义一个名为sync_wrapper的函数,用于在指定的IDA安全模式下调用函数。该函数确保在IDA主线程中执行请求,以避免IDB损坏。def idaread(f):"""标记函数为读取IDB的操作。在IDA主线程中调度请求以…

作者头像 李华
网站建设 2026/4/23 11:33:33

(9-3-03)智能编程助手(IDA Pro+VS Code+MCP):

(9)下面代码的功能是定义了一个名为 get_function_by_name 的函数,通过函数名获取函数信息。该函数首先尝试直接通过名称获取函数地址,如果失败则使用已解析的函数名到地址的映射来查找,如果仍然未找到则抛出 IDAError…

作者头像 李华
网站建设 2026/4/23 12:52:19

5大核心功能曝光,Open-AutoGLM电脑版为何成为企业自动化新宠?

第一章:5大核心功能重塑企业自动化格局现代企业自动化已迈入智能化、集成化的新阶段,以下五大核心功能正在重新定义业务流程的效率与可扩展性。智能流程挖掘 通过分析系统日志与用户操作行为,自动识别流程瓶颈与优化点。企业可借助流程挖掘引…

作者头像 李华
网站建设 2026/4/23 11:26:50

【Open-AutoGLM与Windows融合之道】:实现国产大模型轻量化落地的核心秘钥

第一章:Open-AutoGLM与Windows融合的背景与意义随着人工智能技术在操作系统层面的深度集成趋势日益明显,将大语言模型能力嵌入本地计算环境成为提升用户体验的关键路径。Open-AutoGLM 作为一款开源的自动化生成语言模型框架,具备强大的自然语…

作者头像 李华
网站建设 2026/4/23 12:49:12

好写作AI:降重无忧写作,高效原创与精准复述策略

查重报告上一片飘红,是否让你对论文修改感到绝望?单纯替换同义词的“伪原创”不仅低效,更可能扭曲原意。好写作AI带来全新理念——“理解性降重”,通过智能辅助你深度消化文献,并转化为真正属于你的、高原创性的学术表…

作者头像 李华