python3中的@classmethod和@staticmethod

前言

  • 本文比较了Python3中@classmethod@staticmethod的使用方法

  • 一般要用某个类的方法,先要实例这个类。但是可以通过@staticmethod@classmethod,直接用“类.方法()”来调用这个方法。而 @staticmethod@classmethod 区别是

    • @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
    • @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数
    • @staticmethod中要调用到这个类的一些属性方法,可以直接类名.属性名或类名.方法名
    • @classmethod有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

@classmethod

  • classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
1
2
3
4
5
6
7
8
9
10
11
class A(object):
bar = 1
def func1(self):
print ('foo')
@classmethod
def func2(cls):
print ('func2')
print (cls.bar)
cls().func1() # 调用 foo 方法

A.func2() # 不需要实例化
  • 输出

func2
1
foo

@staticmethod

  • python staticmethod 返回函数的静态方法。该方法不强制要求传递参数
1
2
3
4
5
6
7
8
class C(object):
@staticmethod
def f():
print('runoob');

C.f(); # 静态方法无需实例化
cobj = C()
cobj.f() # 也可以实例化后调用
  • 输出

runoob
runoob

代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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)a = A()

#类中方法均可通过:对象实例.方法() 访问
a.foo(1) #executing foo(<__main__.A object at 0x0000000001E9B488>, 1)
a.class_foo(2) #executing class_foo(<class '__main__.A'>, 2)
a.static_foo(3) #executing static_foo(3)

#@classmethod修饰方法调用: 类对象或对象实例调用
A.class_foo(4) #executing class_foo(<class '__main__.A'>, 4)
a.class_foo(5) #executing class_foo(<class '__main__.A'>, 5)

# 通过类对象 访问常规方法即没有修饰符的方法
A.foo(a,6) #executing foo(<__main__.A object at 0x000000000284C488>, 6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class TestMethod:
def __init__(self, value):
self.num = value

def printNum(self):
print('我是一个普通的类内函数:',self.num)


@classmethod
def classprintNum(cls):
print('我是@classmethod类内函数:',cls(8).num)

@staticmethod
def staticprintNum(value):
print('我是@staticmethod类内函数:',value)

if __name__ == '__main__':
# 普通函数的调用
test = TestMethod(7)
test.printNum()
print('===============')
# classmethod的使用
test.classprintNum()
TestMethod.classprintNum()
print('===============')
# staticmethod的使用
test.staticprintNum(test.num)
TestMethod.staticprintNum(9)
#TestMethod.staticprintNum()
  • 输出

我是一个普通的类内函数:7

我是@classmethod类内函数: 8

我是@classmethod类内函数: 8

我是@staticmethod类内函数: 7

我是@staticmethod类内函数: 9

-------------The End-------------
谢谢大锅请我喝杯阔乐~