python 工具类定义--classmethod,staticmethod应用

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修饰。
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`@classmethod` 和 `@staticmethod` 是 Python 中的装饰器,它们都可以用于类中的方法,但是它们有些许不同。 `@classmethod` 装饰器将一个方法转换为类方法,即类可以直接调用该方法,而不需要实例化一个对象。该方法的第一个参数是类本身,通常被命名为 `cls`。使用 `@classmethod` 装饰器声明类方法时,可以在类方法中访问类属性和类方法,但不能访问实例属性和实例方法。 `@staticmethod` 装饰器将一个方法转换为静态方法,即该方法不需要访问类或实例的任何属性或方法,因此可以在不实例化对象的情况下直接调用该方法。与类方法不同,静态方法不能访问类属性和类方法,也不能访问实例属性和实例方法。静态方法通常用于实现与类相关的函数或工具函数。 下面是一个示例: ```python class MyClass: class_var = 0 # 类属性 def __init__(self, instance_var): self.instance_var = instance_var # 实例属性 @classmethod def class_method(cls): cls.class_var += 1 print(f"Class method: class_var = {cls.class_var}") @staticmethod def static_method(): print("Static method") if __name__ == "__main__": obj = MyClass("instance_var") obj.class_method() # 调用类方法 MyClass.class_method() # 直接通过类调用类方法 obj.static_method() # 调用静态方法 MyClass.static_method() # 直接通过类调用静态方法 ``` 输出结果: ``` Class method: class_var = 1 Class method: class_var = 2 Static method Static method ``` 可以看到,`@classmethod` 装饰器定义的方法可以通过类和实例来调用,而 `@staticmethod` 装饰器定义的方法可以直接通过类和实例来调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值