python语言静态方法和类方法
小标 2018-07-16 来源 : 阅读 909 评论 0

摘要:本文主要向大家介绍了python语言静态方法和类方法,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了python语言静态方法和类方法,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

普通方法,静态方法和类方法

类中最常用的方法是实例方法, 即通过通过实例作为第一个参数的方法。

举个例子,一个基本的实例方法就向下面这个:

class Kls(object):    def __init__(self, data):        self.data = data     def printd(self):        print(self.data) ik1 = Kls('arun')ik2 = Kls('seema') ik1.printd()ik2.printd()

这会给出如下的输出:

arunseema


然后看一下代码和示例图片


1,2参数传递给方法.


3 self参数指向当前实例自身.


4 我们不需要传递实例自身给方法,Python解释器自己会做这些操作的.


如果现在我们想写一些仅仅与类交互而不是和实例交互的方法会怎么样呢? 我们可以在类外面写一个简单的方法来做这些,但是这样做就扩散了类代码的关系到类定义的外面. 如果像下面这样写就会导致以后代码维护的困难:

def get_no_of_instances(cls_obj):    return cls_obj.no_inst class Kls(object):    no_inst = 0     def __init__(self):        Kls.no_inst = Kls.no_inst + 1 ik1 = Kls()ik2 = Kls() print(get_no_of_instances(Kls))

输出:

2

@classmethod

我们要写一个只在类中运行而不在实例中运行的方法. 如果我们想让方法不在实例中运行,可以这么做:

def iget_no_of_instance(ins_obj):    return ins_obj.__class__.no_inst class Kls(object):    no_inst = 0     def __init__(self):    Kls.no_inst = Kls.no_inst + 1 ik1 = Kls()ik2 = Kls()print iget_no_of_instance(ik1)

输出

2

在Python2.2以后可以使用@classmethod装饰器来创建类方法.

class Kls(object):    no_inst = 0     def __init__(self):        Kls.no_inst = Kls.no_inst + 1     @classmethod    def get_no_of_instance(cls_obj):        return cls_obj.no_inst ik1 = Kls()ik2 = Kls() print ik1.get_no_of_instance()print Kls.get_no_of_instance()

输出:

22

这样的好处是: 不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来.

@staticmethod

经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法. 比如更改环境变量或者修改其他类的属性等能用到静态方法. 这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难.
比如这样:

IND = 'ON' def checkind():    return (IND == 'ON') class Kls(object):     def __init__(self,data):        self.data = data def do_reset(self):    if checkind():        print('Reset done for:', self.data) def set_db(self):    if checkind():        self.db = 'new db connection'        print('DB connection made for:',self.data) ik1 = Kls(12)ik1.do_reset()ik1.set_db()

输出:

Reset done for: 12DB connection made for: 12

如果使用@staticmethod就能把相关的代码放到对应的位置了.

IND = 'ON' class Kls(object):    def __init__(self, data):        self.data = data     @staticmethod    def checkind():        return (IND == 'ON')     def do_reset(self):        if self.checkind():            print('Reset done for:', self.data)     def set_db(self):        if self.checkind():            self.db = 'New db connection'        print('DB connection made for: ', self.data) ik1 = Kls(12)ik1.do_reset()ik1.set_db()

输出:

Reset done for: 12DB connection made for: 12

@staticmethod 和 @classmethod的不同

class Kls(object):    def __init__(self, data):        self.data = data     def printd(self):        print(self.data)     @staticmethod    def smethod(*arg):        print('Static:', arg)     @classmethod    def cmethod(*arg):        print('Class:', arg) >>> ik = Kls(23)>>> ik.printd()23>>> ik.smethod()Static: ()>>> ik.cmethod()Class: (<class '__main__.Kls'>,)>>> Kls.printd()TypeError: unbound method printd() must be called with Kls instance as first argument (got nothing instead)>>> Kls.smethod()Static: ()>>> Kls.cmethod()Class: (<class '__main__.Kls'>,)

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程