python中的@classmethod和@staticmethod

花两分钟了解什么是实例方法,类方法,静态方法。

一、定义

python中类方法和静态方法是用装饰器@classmethod@staticmethod来定义的。

点我学习什么是装饰器

我们先来看一个简单的实例:

1
2
3
4
5
6
7
8
9
10
11
class A(object):
def foo(self,x):
print ("executing foo(%s,%s)"%(self,x))
@classmethod
def class_foo(cls,x):
print ("executing class_foo(%s,%s)"%(cls,x))
@staticmethod
def static_foo(x):
print ("executing static_foo(%s)"%x)

我们定义了一个class A,类A里面分别定义了普通方法foo,@classmethod修饰的类方法class_foo,还有@staticmethod修饰的静态方法static_foo,那么他们之间有什么区别呢?
我们不妨来验证一下:

1
2
3
4
5
6
7
8
9
a=A()
print(a.foo)
print(a.class_foo)
print(a.static_foo)
# 输出结果
# <bound method A.foo of <__main__.A object at 0x0121B950>>
# <bound method A.class_foo of <class '__main__.A'>>
# <function A.static_foo at 0x01222078>

我们从输出结果可以看到:

  • foo是绑定在实例a上的,参数self便是实例a本身
  • class_foo是绑定在class A上的,参数cls指向class A本身
  • static_foo不绑定在a或者A上,所以没有额外的参数

二、使用

那么使用上有什么区别呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
a = A()
a.foo(1)
a.class_foo(1)
a.static_foo(1)
# A.foo(2) #error
A.class_foo(2)
A.static_foo(2)
# 输出结果
# executing foo(<__main__.A object at 0x0121B950>,1)
# executing class_foo(<class '__main__.A'>,1)
# executing static_foo(1)
# executing class_foo(<class '__main__.A'>,2)
# executing static_foo(2)

从上面的代码我们可以看到,使用上的区别:

  • foo是绑定在实例a上的,只能通过实例去调用
  • class_foo绑定在类A上,可以通过实例a或者类A去调用
  • static_foo不绑定任何参数,也可以通过实例a或者类A去调用

三、总结

类和实例都是对象,所以它们可以有方法:

  • 实例的方法就叫实例方法。
  • 类的方法就叫类方法。
  • 静态方法就是写在类里的普通方法,必须用类来调用,比如说有一些跟类有关系的功能,但是运行的时候又不需要实例和类参与的函数,这个时候就可以用@staticmethod,因为如果写一堆全局函数,可能后续会变得难以维护。

References:

坚持原创技术分享,您的支持将鼓励我继续创作!