Python中@classmethod与@staticmethod的区别与用法详解

陈默
陈默
发布时间:2026-10-16| 5人浏览过
原创

本文详细解析Python中@classmethod和@staticmethod装饰器的区别。@staticmethod无需默认参数,直接绑定在类上,通过类和实例均可调用;@classmethod必须包含cls参数,用于访问类属性和其他类方法。两者均支持通过类和实例调用,但内部机制不同,cls允许访问类状态,而静态方法则完全独立。

在Python的类定义中,@classmethod和@staticmethod是两个常用的装饰器。它们的主要区别在于参数传递和调用方式,下面将具体分析它们的作用与差异。

  • @classmethod:该方法默认接收一个cls参数,既可以通过类名调用,也可以通过实例对象调用。
  • @staticmethod:静态方法不接收默认参数,既可以通过类名调用,也可以通过实例对象调用。

1. @staticmethod详解:

首先通过代码示例进行说明:

class A:
    def f1(x):
        print(x)
         
A.f1(2)  # 2  类.函数

定义一个类,并通过类名直接调用其中的函数。

class A:
    @staticmethod
    def f1(x):
        print(x)
         
A.f1(2)  # 2  类.静态方法
A().f1(2)  # 2 对象.静态方法  这种情况下是可以执行的,如果上述f1没有被staticmethod装饰那么就会报错!!!

定义一个类,并通过类名调用函数。由于该方法使用了@staticmethod装饰器,因此也可以通过实例对象调用该方法。

由此可见,使用@staticmethod装饰的函数,既可以直接通过类名调用,也可以通过实例化后的对象调用。

此外,@staticmethod装饰的函数不需要传递self参数,因为它直接绑定在类上,而非类的实例上。

2. @classmethod详解:

class A:
    @classmethod
    def f1(cls,x):
        print(x)
         
A.f1(2)  # 2  类.方法
A().f1(2) # 2  对象.方法

定义一个类,并通过类名调用函数。由于该方法使用了@classmethod装饰器,因此也可以通过实例对象调用。需要注意的是,在装饰后的方法中,必须显式传递cls参数。

class B:
    name = 'bruce'
    age = 16
    @classmethod
    def f1(cls,x):
        print(x)
        print(cls.age)
        print(cls.name)
B().f1(1)
# 1
# 16
# bruce

上述示例表明,使用@classmethod装饰的方法,通过cls参数可以在方法内部访问类的属性。

class C:
 
    @classmethod
    def f1(cls,x):
        print(x)
        cls().f2()
 
    def f2(self):
        print('hello world')
 
C.f1(1) 或者 C().f1(1)# 1<br># hello world

上述示例还表明,使用@classmethod装饰的方法,通过cls参数可以在方法内部调用类的其他方法。

因此,在类中使用@classmethod装饰的函数,必须在方法定义中传递第一个参数cls。该函数既可以通过类名直接调用,也可以通过实例对象调用。

由于传递了cls参数,该方法可以访问类中的其他属性和方法。

至此,关于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 算法库。