staticmethod与classmethod
staticmethod与classmethod的具体说明,请参考Python相关文档。
以下举例子说明二者异同。
1 # 旧式
2 class Foo_Old(object):
3 instance_str="Old style.I am a instance method."
4 static_str="Old style.I am a static method."
5 class_str="Old style.I am a class method."
6 def __init__(self):
7 pass
8
9 def instance_method(self):
10 print(self.instance_str)
11
12 def static_method():
13 print(Foo_Old.static_str)
14 static_method=staticmethod(static_method) # 将static_method设置为静态方法。
15
16 def class_method(cls): # cls 就像self一样,是一个约定俗成的命名。
17 print(cls.class_str)
18 class_method=classmethod(class_method) # 将class_method设置为类方法。
19
20 foo_old=Foo_Old()
21 foo_old.instance_method()
22 foo_old.static_method()
23 foo_old.class_method()
24
25 # Foo_Old.instance_method(Foo_Old)
26 Foo_Old.static_method()
27 Foo_Old.class_method()
28 print("")
29
30 # 新式
31 class Foo_New(object):
32 instance_str="New style.I am a instance method."
33 static_str="New style.I am a static method."
34 class_str="New style.I am a class method."
35 def __init__(self):
36 pass
37
38 def instance_method(self):
39 print(self.instance_str)
40
41 @staticmethod
42 def static_method():
43 print(Foo_New.static_str)
44
45 @classmethod
46 def class_method(cls):
47 print(cls.class_str)
48
49 foo_new=Foo_New()
50 foo_new.instance_method()
51 foo_new.static_method()
52 foo_new.class_method()
53
54 # Foo_New.instance_method(Foo_New)
55 Foo_New.static_method()
56 Foo_New.class_method()
57 print("")
58
59 # 继承
60 class Foo_Sub(Foo_New):
61 instance_str="Sub .I am a instance method."
62 static_str="Sub .I am a static method."
63 class_str="Sub .I am a class method."
64 def __init__(self):
65 pass
66
67 foo_sub=Foo_Sub()
68 foo_sub.instance_method()
69 foo_sub.static_method() # 行为与父类相同。
70 foo_sub.class_method()
71
72 # Foo_Sub.instance_method(Foo_Sub)
73 Foo_Sub.static_method() # 行为与父类相同。
74 Foo_Sub.class_method()
75 print("")
共同:
classmethod和staticmethod,都不需要建立类的实例,便可执行。
差异:
1,类调用 classmethod 时,第一个参数是隐式传入的“类的对象”,即代码中的 cls 。所以子类使用的是自己的信息,会覆盖父类的信息。
2,staticmethod 不像 classmethod 能传入“类的对象”,被调用时不会区分父类与子类,按照统一的行为执行(按照最初定义执行)。所以staticmethod更像一个定义在类之中的“全局函数(global function)”,而不是一个普通的“方法(method)”。