Python中通过类名和cls修改类变量的值及注意事项

小林子
小林子
发布时间:2026-10-16| 4人浏览过
原创

本文深入解析Python中类变量与实例变量的区别,重点讲解如何利用@classmethod和cls参数通过类名直接修改类变量的值。文章指出,通过实例对象修改类变量会创建同名实例变量,而通过cls或类名修改则会影响所有实例。同时提供了完整的代码示例,演示了类方法在模型加载等场景下的实际应用,并强调了类变量定义顺序的重要性。

  • 若试图通过类的实例对象来修改类变量的值,实际上并未改变类变量本身,而是为该实例对象创建了两个新的实例变量(如name和age)。这种操作不会影响类中其他已实例化的对象,也不会对原本定义的类变量产生任何影响。
  • 与类变量不同,实例变量仅能通过具体的类对象实例进行访问,无法直接通过类名来调用或访问。
  • 若使用cls参数或类名来修改类变量的值,则会真正改变该同名的类变量,这一更改会立即反映在所有后续的实例化对象中。

通过类对象与类方法修改类变量的区别

class Person:
    name='jerry'
    age='20'
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("构造函数", name, age)
    @classmethod
    def A(cls):
        # cls()等价于类Person(),
        # 通过类对象p是无法修改类变量的
        p=cls("Tom", 18)
        print('cls:', cls, p)
        return p
 
    @classmethod
    def B(cls):
        # 类方法cls可以直接调用类变量
        print("B结果:", cls.name, cls.age)
 
    @classmethod
    def C(cls):
        # 类方法cls可以直接调用类变量
        # cls和类名一样可修改类变量的值,会影响所有的实例化对象
        cls.name="曹操"
        cls.age=50
if __name__ == '__main__':
 
    Person.B()
    Person.C()
    print("C方法修改后,类变量的值:", Person.name, Person.age)
    # 可以使用类名直接调用类方法
    person = Person.A()
    print(person.name, person.age)
    print("最终类变量的值:", Person.name, Person.age)
 D:\MC\venv\Scripts\python.exe D:/MC/test01.py

运行B方法后的输出结果如下所示:

jerry 20

执行C方法并修改类变量后,类变量的当前值为:曹操 50。此时构造函数输出的Tom 18仍为初始状态。

cls: <class '__main__.Person'> <__main__.Person object at 0x000002362F849D00>
Tom 18

最终确认类变量的值为:

曹操 50

Process finished with exit code 0

类方法实现实例ID自增与模型加载应用

我对Man类进行了两次实例化操作,生成的每个实例拥有不同的内存地址(id不同)。这一功能是通过类方法实现的:首先使用@classmethod装饰器定义类方法,然后在方法内部使用“cls”关键字代表当前类本身。类方法对类属性进行的处理具备状态记忆功能。

需要特别注意:类方法所处理的变量必须为类变量。因为在类方法内部无法使用self来寻址实例变量,因此建议将类变量定义在代码的最前端,如上文示例中的“id=0”所示。虽然类变量可以通过self访问,但在__init__函数中无需再次对类变量进行描述。因此,在上述代码中,self.id并非必须存在。

对于需要动态改变类变量值的场景(例如每次调用id_number(cls)方法时,类变量id的值随之递增),可以高效利用此技巧进行模型加载。具体做法是将模型封装为一个类,将网络初始化和模型加载逻辑封装在类方法中。这样,每次执行load操作后,模型即可被持续复用。

class Man:
    id = 0  # 类变量
    def __init__(self, name):
        self.name = name
        self.id = self.id_number()
    @classmethod
    def id_number(cls):
        # 类方法可以改变类属性,对类属性进行的处理是有记忆性的。
        # 类方法处理的变量一定要是类变量。因为在类方法里你用不了self来寻址实例变量,
        # 所以需要把类变量放到最前面描述,如上面的"id=0"所示。
        cls.id += 1
        cls.ww=2
        return cls.id, cls.ww
 
 a = Man('A')
print(a.id)
b = Man('B')
print(b.id)
c=Man.id_number()
print(c)
D:\MC\venv\Scripts\python.exe D:/MC/test2.py
(1, 2)
(2, 2)
(3, 2)
 Process finished with exit code 0

至此,关于Python中通过类名和类方法cls修改类变量值的介绍已完成。如需了解更多相关Python修改类变量值的内容,建议搜索本站历史文章或继续浏览后续相关文章。感谢大家的支持!

相关标签:

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

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 算法库。