基于python中的静态方法,类方法以及类变量的用法
在开发过程中用到了,静态方法,类方法,以及类变量,下面就这个特殊的用法做个总结
1 类方法
在python中类方法使用装饰器@classmethod关键字类修饰;并且它的第一个参数是隐式参数cls,这个参数其实就式类本身,相当于C++中的this。这个隐士参数在我们调用类方法的时候,是不需要传入的。
什么情况下会用到类方法呢?
1.采用工厂模式:就是如果我们通过不同的传参,能实例化不同的类对象。
2.无需修改__init()初始化函数就可以实现。
下面我们看一个实例:
class mtcomm:
def __init__(self,mchine_no,name):
self.mchineNo = machine_no
self.name = name
@classmethod
def machine_mtcomm(cls,machine_no,name='one'):
return cls(machine_no,name)
machineOne = mtcomm.machine_mtcomm(1)
machineOne = mtcomm.machine_mtcomm(2,'two')
上面的实例中定义个一个machine_mtcomm的类方法
所有的mtcomm接口都可以通过这个类方法实现实例化,相当于一个工厂类。通过传递不同的参数实例化不同的对象。
2 静态方法
在python的静态方法跟C++的静态成员函数相似。python中用@staticmethod关键字修饰
静态方法与常规的函数方法有什么区别
静态方法属于类本身,不会实例化到对象,而常规的成员函数是需要通过实例化对象来调用的。
什么情况下会要使用静态方法呢?
当这个函数只有这个类调用,其他地方没有调用,单独放到其他地方有显得多余,这个时候我们就使用静态方法
下面我们看一个例子
class MtCmd:
@staticmethod
def getuser():
'''
获取当前进程用户,windows下默认用windos表示
'''
if sys.platform=='win32':
return 'windos'
else:
return pwd.getpwuid(os.getuid())[0]
@staticmethod
def getgroup(user:str=None)->str:
'''
获取指定用户的所属的组
若user为None则获取当前进程用户所属的组
'''
if sys.platform=='win32':
return 'windos'
elif user is None:
user = MtCmd.getuser()
try:
gid = pwd.getpwnam(user)[3]
return grp.getgrgid(gid)[0]
except KeyError as e:
logging.error('user [%s]->%s',user,e)
return None
这个类定义了两个静态方法函数,一个是getuser(),一个是getgroup()因为这两个函数,只有mtcmd这个类会调用,其他地方不会调用,因此用到静态方法。
3 类变量
在python中类变量实际上跟C++中的静态变量比较类似,既然是类变量,这个这个变量属于类本身,因此它不属于实例化对象,也只能被类所调用.
类变量定义在类的定义之后,实例变量则是以为self.开头
下面举个例子:
class MtInstall:
ENVS = {'物理机':PM_T,'虚拟机':VM_T}
KEYS = ['基础环境','机器号','型号','机器名','端口配置']
_func = None
def __init__(self):
self.values = {}
self.senseType = None
self.machineNum = None
self.envType = [] # 环境类型
self.machineNos = [] # 机器号
env = MtInstall.ENVS.get("物理机",None)#类变量调用
mtInstall = MtInstall()
machineNo = mtInstall.machineNum#实例化对象调用成员变量
上面的实例中ENVS KEYS _func都属于类变量,通过类本身调用,machineNum是常规的成员变量,通过实例化对象调用。
原文地址:http://www.cnblogs.com/clark1990/p/16910249.html