Python类变量与实例变量的区别及访问机制详解

小岛来信
小岛来信
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Python中类变量与实例变量的定义、访问方式及相互关系。通过代码示例验证,当使用self修改类变量时,实际是创建了同名的实例变量并屏蔽类变量。类变量由所有实例共享,建议通过类名访问;实例变量仅属于特定对象。理解这一机制有助于避免变量作用域混淆。

类变量与实例变量的基本概念

1、类变量、实例变量概念

类变量:

类变量是指在类定义中、但在任何函数体之外声明的变量。这类变量通常不使用 self.变量名进行赋值,因此不属于特定实例。类变量被该类的所有实例所共享,具有公共属性。

实例变量:

实例变量是在方法内部定义的变量,通过 self 绑定到具体的实例上。它仅对当前实例有效,不同实例拥有独立的副本。

类变量与实例变量的访问方式

2、访问

类变量

在类的内部和外部,都可以通过 className.类变量 的形式直接访问类变量。但在类内部,也可以使用 self.类变量 进行访问,不过这两种方式在语义和行为上存在差异(后续将通过代码验证)。

实例变量

在类的内部,通过 self.实例变量 的形式访问;在类的外部,则通过 对象名.实例变量 的形式访问。实例变量绑定到特定实例,仅属于该实例。而类变量则是所有来自同一类的实例所共享的资源。这里可能会产生一个疑问:

如果类变量被所有实例共享,那么当其中一个实例通过 object.类变量 = value 的方式修改类变量时,其他实例是否也能看到这一变化?

答案是否定的,下面通过代码进行验证。

代码验证:self修改类变量的行为


class A(object):
  # 定义一个类变量,初值是10
  class_var = 10
  print id(class_var)
  def foo(self):
  print '在类中访问类变量:A.class_var=', A.class_var
  print '在类中访问实例变量: self.class_var=', self, self.class_var
 
  # 改变实例变量的值
  self.class_var = 40
  print '修改后访问类变量:A.class_var=', A.class_var
  print '修改后访问实例变量 self.class_var=',self, self.class_var
 
  # 这里的class_var和函数外面的class_var不是同一个东西,这是一个局部变量
  class_var = 20
  print id(class_var)
  print 'class_var=', class_var
 
     
  A.class_var = 15
  print 'A.class_var=', A.class_var
  print 'class_var=',class_var
  print 'self.class_var=',self.class_var
     
 
obj1 = A()
obj2 = A()
obj3 = A()
obj1.foo()
print A.class_var
print obj1.class_var
print obj2.class_var
print obj3.class_var

Output:


49964144
在类中访问类变量:A.class_var= 10
在类中访问实例变量: self.class_var= <__main__.A object at 0x0000000002FD2390> 10
修改后访问类变量:A.class_var= 10
修改后访问实例变量 self.class_var= <__main__.A object at 0x0000000002FD2390> 40
49963904
class_var= 20
A.class_var= 15
class_var= 20
self.class_var= 40
15
40
15
15

从上述运行结果分析:当使用 self.class_var 形式访问并修改类变量后,可以发现类变量(通过类名访问)的值并未发生变化;即使直接修改类变量的值,self.class_var 的值也未受其影响。

从最后打印 obj2 和 obj3 这两个来自同一类的实例来看,它们的类变量值与修改后的类变量值一致,表明它们确实共享同一个类变量。

核心结论与最佳实践

3、总结

1、类变量可以通过 className.类变量 和 self.类变量 两种方式访问。 2、如果使用 self.类变量的方式访问并重新赋值,该变量将变为实例变量并与 self 绑定,实际上变成了一个实例变量,此时实例变量会屏蔽类变量的值。 3、类变量是共享的,建议优先使用类名的方式来访问类变量。 4、当通过 self 访问类变量时,若进行赋值操作,它会被转化为实例变量并绑定到特定实例上。 5、对类变量通过实例变量(self)的形式重新赋值后,类变量的值不会随之变化。 6、实例变量对每一个对象是独立的,每个对象拥有可能不同的值。

以上我们整理的知识点希望能够帮助到大家,感谢大家对本站的支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。