python中@staticmethod和@classmethod用法和解释
先来解释一下staticmethod和classmethod。直接一点来说,我们知道对于一个普通的类,我们要使用其中的函数的话,需要对类进行实例化,而一个类中,某个函数前面加上了staticmethod或者classmethod的话,那么这个函数就可以不通过实例化直接调用,什么意思呢?就是说有时候,我们需要把一些具有特定功能的函数放到一起,做成包导入Python程序,最好就是把他们放到一个类中,但是一个类每次我都要去实例化他,我觉得很麻烦,于是我在函数前面加上了@staticmethod,@classmethod,那么我下次用这个函数的功能的时候,可以直接用 类名.函数名 的形式了,这样是不是省心多了?
- @staticmethod将函数转换成为一个静态方法,@classmethod将函数转换成为一个类方法。
- @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
- @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
- 如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
- @classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
实例方法 | 类方法(classmethod) | 静态方法(staticmethod) | |
定义方式 | self作为第一个参数 | cls作为第一个参数 | 无强制参数 |
绑定对象 | 类的实例 | 类 | 无 |
调用方式 | 只能通过类的实例调用 | 类对象或者类的实例均可调用 | 类对象或者类的实例均可调用 |
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-04-04 12:46:46 # @Author : Your Name (you@example.org) # @Link : http://example.org # @Version : $Id$ class Test: def __init__(self, u): self.u = u print("类的初始化方法") def fun1(a, c): print("fun1: I' am instancemethod {}".format(c)) @staticmethod def fun2(): print("fun2: I' am staticmethod") Test("fdsf").fun1("call1") @classmethod def fun3(cls): print("fun3: I'am classmethod") cls("ooo").fun1("这样调用") Test("a").fun1("I' am args") Test.fun2() Test.fun3()
参考:https://blog.csdn.net/ibelieve8013/article/details/83037996