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

作者:wswang 时间:2023-09-30 22:03:32 

例子


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 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来查看,如下:


```
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中的静态方法很相似

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

来源:http://www.cnblogs.com/wswang/p/7717993.html

标签:python,staticmethod,classmethod
0
投稿

猜你喜欢

  • 如何搜索查找并解决Django相关的问题

    2022-02-12 09:58:51
  • sqlserver中去除字符串中连续的分隔符的sql语句

    2012-06-06 20:07:39
  • Django的URLconf中使用缺省视图参数的方法

    2021-05-03 17:46:29
  • SQLServer中字符串左对齐或右对齐显示的sql语句

    2012-06-06 19:36:45
  • Python 文件与文件对象及文件打开关闭

    2021-06-16 16:08:44
  • Css 清除浮动

    2008-09-15 18:47:00
  • 这些CSS Selector,你都熟悉吗?

    2008-12-21 16:30:00
  • Asp 防止网页频繁刷新一法

    2008-04-07 13:03:00
  • Python3 json模块之编码解码方法讲解

    2021-07-15 17:29:15
  • 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等

    2024-01-26 16:53:22
  • Python多个MP4合成视频的实现方法

    2021-02-21 13:50:44
  • 三分钟掌握PHP操作数据库

    2023-06-01 01:15:43
  • oracle命令行删除与创建用户的代码

    2009-03-02 10:54:00
  • document.getElementById的简写方式

    2010-06-21 10:44:00
  • Windows系统下MySQL无法启动的万能解决方法

    2024-01-16 10:59:26
  • javascript检测对象中是否存在某个属性判断方法小结

    2024-04-30 10:10:54
  • 在IE8中继续使用滤镜及IE8的一些CSS扩展属性

    2009-02-21 11:18:00
  • python爬取网易云音乐排行榜实例代码

    2023-07-24 09:26:52
  • python 给图像添加透明度(alpha通道)

    2021-05-04 04:57:22
  • 解析Python中while true的使用

    2022-07-23 21:19:53
  • asp之家 网络编程 m.aspxhome.com