python中类方法,静态方法,成员函数

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

上面的实例中定义个一个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是常规的成员变量,通过实例化对象调用。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值