文章目录

  • 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

实例方法特点

  1. 实例方法,依赖于实例对象self存在。
  2. 实例方法,使用实例对象调用;如果用类名调用,则需要传入实例对象。
  3. 实例方法,可以通过实例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

类方法的特点:

  1. 类名本身在python内部对应了类对象cls。
  2. classmethod依赖于类对象cls存在。
  3. 支持类名调用和实例对象调用,与Java的static方法一致。
  4. 可以通过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

静态方法特点:

  1. 静态方法本身不依赖于对象存在。
  2. 静态方法可以认为是定义在一个对象内的普通方法,与对象毫无关系。
  3. 静态方法支持类名调用和实例对象调用,与Java的static方法一致。
  4. 与classmethod不同在于静态方法不能够方法类内部的成员变量,即与类没有任何关系。

2.4 总结

  可以使用classmethod和staticmethod来定义工具类。

  1. 如果需要在工具类内部引用成员变量,比如一些常量信息可以通过classmethod修饰。
  2. 如果与类毫无关系的方法,可以使用staticmethod修饰。