基于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

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