Python中@classmethod与@staticmethod的区别及实战应用

Oliver
Oliver
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析Python中@classmethod与@staticmethod的核心区别。通过代码示例展示如何利用@classmethod直接修改类的私有属性,避免逐个实例化对象的繁琐操作。对比两者在参数传递、属性调用及硬编码规避方面的差异,帮助开发者掌握类方法的正确使用场景。

@classmethod修改类私有属性的实战场景

在Python编程中,@classmethod主要面向类本身而非具体实例。定义类时,常会设置静态私有属性,但在使用类时可能需要修改这些属性。若不使用类方法,修改属性只能通过实例对象逐一进行,这在拥有大量实例时效率极低且代码冗余。@classmethod的出现解决了这一问题,使得无需实例化即可直接操作类属性。具体实现逻辑见下方代码。


class Goods:
    __discount = 0.8
    def __init__(self,name,money):
        self.__name = name
        self.__money = money
    @property
    def price(self):
        return self.__money*Goods.__discount
    @classmethod
    def change(cls,new_discount):#注意这里不在是self了,而是cls进行替换
        cls.__discount = new_discount

apple = Goods('苹果',5)
print(apple.price)
Goods.change(0.5) #这里就不是使用apple.change()进行修改了
print(apple.price)

@classmethod与@staticmethod的核心区别

上述代码展示了@classmethod的一种典型应用场景,后续如有新用法将持续补充。既然@staticmethod和@classmethod均可通过类名直接调用方法,二者究竟有何本质区别?

从调用方式来看: @staticmethod无需self(实例引用)和cls(类引用)参数,其用法与普通函数无异。 @classmethod虽不需要self参数,但第一个参数必须是cls,用于指向调用该方法的类本身。

若在@staticmethod内部需要访问类的属性或方法,只能硬编码使用类名.属性或类名.方法。而@classmethod因持有cls参数,可灵活调用类的属性、方法及实例化对象,有效避免硬编码带来的维护问题。具体代码示例如下。


class A(object):  
    bar = 1  
    def foo(self):  
        print 'foo'  

    @staticmethod  
    def static_foo():  
        print 'static_foo'  
        print A.bar  

    @classmethod  
    def class_foo(cls):  
        print 'class_foo'  
        print cls.bar  
        cls().foo()  
###执行  
A.static_foo()  
A.class_foo() 

类方法在实例配置中的应用

知识点扩展:Python中@classmethod的具体用法解析

实际需求:为类对象添加属性,以便在新建具体实例时直接使用该变量配置。


class A():
 
    def __init__(self,name):
        self.name = name
        self.config = {'batch_size':A.bs}
    @classmethod
    def set_bs(cls,bs):
        cls.bs = bs
    def print_config(self):
        print (self.config)
 
A.set_bs(4)
a = A('test')
a.print_config()

以上内容详细阐述了Python中@classmethod与@staticmethod的使用技巧,更多相关技术文章请持续关注本站更新。

相关标签:

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

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