基于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