基于python中的静态方法,类方法以及类变量的用法
最近在做scada系统的自动化部署,采用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’)
1
2
3
4
5
6
7
8
9
10
上面的实例中定义个一个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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
这个类定义了两个静态方法函数,一个是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#实例化对象调用成员变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
上面的实例中ENVS KEYS _func都属于类变量,通过类本身调用,machineNum是常规的成员变量,通过实例化对象调用。
————————————————
版权声明:本文为CSDN博主「xiaoji_electric」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liujicailiujitian/article/details/121726407

原文地址:http://www.cnblogs.com/clark1990/p/16910244.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性