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

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

本文详细解析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 相关产品和应用

全部下载

专题列表