python类方法与静态方法

classmethod和staticmethod

在遇到的项目代码中,在类里面经常看到这两个装饰器。今天就来具体说说这这两货是干嘛的。

一般情况下,我们定义一个类,里面会有一些属性和方法。我们通过类实例化一个对象,这个对象就有了这些属性和方法,就能正常调用了。

Python中的类也是一个普通对象,如果需要直接使用这个类,例如将类作为参数传递到其他函数中,又希望在实例化这个类之前就能提供某些功能。这个时候就需要用到classmethod和staticmethod了。

这么说吧,staticmethod函数只不过是碰巧存在类中的一个函数而已,既可以通过类来调用,可以实例化一个对象以后,通过对象来调用。

classmethod函数不需要实例化一个对象就能直接用,当我们需要在实例化之前就对类做一些操作,这个时候就可以用到classmethod了。

一般的函数,只有在实例化对象以后才能调用。

用法

看以下的一个简单例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class (object):
def m1(self, n):
print("self:", self)


def m2(cls, n):
print("cls:", cls) ## cls相当于类对象本身

@staticmethod
def m3(n):
pass

a = A()
a.m1(1)
A.m2(1)
A.m3(1)

什么时候使用classmethod?什么时候用staticmethod?

查了很多资料,没看到特别好的说明。可能也只有在多写项目代码后才能体会二者的区别。这里就我个人理解做一点简要说明。

有的时候再实例化之前,就需要先和类做一定的交互。这个时候就需要classmethod或者staticmethod。

如果只是不需要访问类中任何实例方法和属性,仅仅作为一个函数实现某种功能,这种情况下适合使用staticmethod。

其他情况,适合使用classmethod。

再简单一点来说,静态方法就是个一般的函数,完全可以放在类的外面,只不过面象对象一般都是通过类来实现,就把这个函数给封到类里面去了。

欢迎补充

关于classmethod和staticmethod的更多细节,欢迎补充。