文章目录
- 1. 为什么定义工具类
- 2. 定义工具类
- 2.1 实例方法
- 2.2 classmethod方法
- 2.3 staticmethod方法
- 2.4 总结
1. 为什么定义工具类
平时开发程序的过程中,有很多方法是可以重复使用的,不依赖于特定的变量、特定的程序上下文。
比如算法中对于一个链表的反转,数组中元素的交换;项目开发中获取文件列表,获取IP地址。
这些方法我们在实践过程中,都可以固化下来,作为未来开发的斧子,锤子工具,降低开发难度,增加开发效率。
2. 定义工具类
参考Java,一个工具类对“对象实例”并不依赖,即不用new对象就可以直接使用,Java中通过static字段来实现,python中使用classmethod和staticmethod来实现,那么他们的区别又是什么呢?
查看如下代码:
class Utils(object):
def getMsg(self, arg):
print("self is ", self, ", arg is ", arg)
MSG_SUC = "class"
@classmethod
def getClassMsg(cls, arg):
print("cls is ", cls, ", arg is ", cls.MSG_SUC)
@staticmethod
def getStaticMsg(arg):
print("arg is ", arg)
2.1 实例方法
utils = Utils()
utils.getMsg("ig")
print("类名引用", Utils.getMsg)
print("实例引用", utils.getMsg)
# Utils.getMsg("msg") ### 出错
Utils.getMsg(utils, "msg")
self is <__main__.Utils object at 0x00000206BF42C470> , arg is ig
类名引用 <function Utils.getMsg at 0x00000206BF4650D0>
实例引用 <bound method Utils.getMsg of <__main__.Utils object at 0x00000206BF42C470>>
self is <__main__.Utils object at 0x00000206BF42C470> , arg is msg
实例方法特点
- 实例方法,依赖于实例对象self存在。
- 实例方法,使用实例对象调用;如果用类名调用,则需要传入实例对象。
- 实例方法,可以通过实例self引用类内成员变量。
2.2 classmethod方法
Utils.getClassMsg("")
print("类名引用", Utils.getClassMsg)
print("实例引用", utils.getClassMsg)
utils.getClassMsg("nig")
cls is <class '__main__.Utils'> , arg is class
类名引用 <bound method Utils.getClassMsg of <class '__main__.Utils'>>
实例引用 <bound method Utils.getClassMsg of <class '__main__.Utils'>>
cls is <class '__main__.Utils'> , arg is class
类方法的特点:
- 类名本身在python内部对应了类对象cls。
- classmethod依赖于类对象cls存在。
- 支持类名调用和实例对象调用,与Java的static方法一致。
- 可以通过cls访问类内成员变量
2.3 staticmethod方法
Utils.getStaticMsg("static")
print("类名引用", Utils.getStaticMsg)
print("实例引用", utils.getStaticMsg)
utils.getStaticMsg("ing")
arg is static
类名引用 <function Utils.getStaticMsg at 0x00000206BF465598>
实例引用 <function Utils.getStaticMsg at 0x00000206BF465598>
arg is ing
静态方法特点:
- 静态方法本身不依赖于对象存在。
- 静态方法可以认为是定义在一个对象内的普通方法,与对象毫无关系。
- 静态方法支持类名调用和实例对象调用,与Java的static方法一致。
- 与classmethod不同在于静态方法不能够方法类内部的成员变量,即与类没有任何关系。
2.4 总结
可以使用classmethod和staticmethod来定义工具类。
- 如果需要在工具类内部引用成员变量,比如一些常量信息可以通过classmethod修饰。
- 如果与类毫无关系的方法,可以使用staticmethod修饰。