基于python中staticmethod和classmethod的区别(详解)

例子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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()

上述类有三个函数,使用如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
a.foo(1)
# executing foo(< __main__.A object at 0xb7dbef0c>,1)
 
-----------------------------------------------------------------
 
a.class_foo(1)
# executing class_foo(< class '__main__.A'>,1)
 
A.class_foo(1)
# executing class_foo(< class '__main__.A'>,1)
 
-----------------------------------------------------------------
 
a.static_foo(1)
# executing static_foo(1)
 
A.static_foo('hi')
# executing static_foo(hi)

区别

• foo()的调用者必须是类A的一个实例,class_foo()与static_foo()的调用者既可以是类也可以是某个实例

• 参数不同,foo() 参数为self和其他参数,class_foo()参数使用类(cls)替换了self,static_foo()则只有参数,没有self和类(cls)

• a.foo(1)中的foo()与a是绑定的,class_foo()是与类绑定的,而static_foo()与这两者都没有绑定,可以使用print来查看,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```
print(a.foo)
# < bound method A.foo of <main.A object at 0xb7d52f0c>>
 
print(a.class_foo)
# < bound method type.class_foo of <class 'main.A'>>
 
print A.class_foo
< bound method classobj.class_foo of >
 
print(a.static_foo)
#
print(A.static_foo)
#
```

作用

• 使用场景:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,staticmethod一般情况下可以替换为外部的函数,后者继承的时候不可更改,和C++/JAVA中的静态方法很相似

• 有利于组织代码,同时有利于命名空间的整洁

以上这篇基于python中staticmethod和classmethod的区别(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

转载于:https://www.cnblogs.com/qunxiadexiaoxiangjiao/p/8322441.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值