文档章节

pyhton静态方法和类方法

J
 JMARS
发布于 2014/01/09 18:31
字数 889
阅读 165
收藏 11

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

e5f0b2c9-4d18-478e-89d2-bfdd4de7c13d
然后看一下代码和示例图片:

  • 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'>,)

下面这个图解释了以上代码是怎么运行的:
ba891976-5269-4f78-8222-5512e7b47c4d

本条目发布于  2013 年 8 月 6 日。属于  python 分类,被贴了


本文转载自:http://www.libaoyin.com/2013/08/06/pyhton-staticmethod-classmethod/

J
粉丝 1
博文 5
码字总数 0
作品 0
海淀
私信 提问
通过help()自学Python

pyhton中 通过如下链接学习相关基本内容,包括:基本数据类型、控制流、数据结构、模块、输入输出、异常捕获、类。 1.help命令 help(类名)查看类中所有详细的功能 help(类名.函数名)查看...

Yulong_
2016/04/20
0
0
Pyhton自由之路(六)闭包与装饰器

设计模式中有一种叫做装饰者模式,而在JAVA社区中,有一种技术被称之为AOP。 个人理解为,在某一过程运行时程序能动态地控制过程的行为。可惜目前的我离这个目标还有段距离,只能通过反射机制...

ysisl222
2009/08/17
0
0
Pyhton3编程规范

行末尾不能加分号 行长度 每行不超过80个字符 以下情况除外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行。 Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这...

91ctt
2016/11/22
0
0
Python 经典类和新式类

由Python2.7转向python3.4 (感觉python有些语法还是很奇怪如生成器等,好了抱怨了,自己实践的少) 因为国内大部分还是pyhton2的,所以有时莫名其妙会讲这个问题:经典类和新式类 有个好消息...

Galy_绿
2016/07/24
33
0
2017年python教程持续更新

大数据Pyhton教程 https://pan.baidu.com/s/1qYuF8mg 内容包含: python简介 python的安装 Pyhton教程_03.helloworld与中文编码问题 Pyhton教程_04.python基本语法&缩进代码表示法&字符串表现...

大象分享
2017/03/05
426
1

没有更多内容

加载失败,请刷新页面

加载更多

最开始学习素描的步骤是什么?

最开始学习素描的步骤是什么?很多学画画的朋友们都会问直接跳过素描不学素描行不行,小编非常的肯定告诉你不行,素描是所以绘画类的基础,台阶是一层一层筑起的,目前的现实是未来理想的基础...

设绘嗨
24分钟前
1
0
Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray

code val linkPairSum = F.udf( (list:List[Map[Long,Int]]) => { var map = Map[Long,Int]() for(m <- list){ if(m != null){ ......

张欢19933
25分钟前
1
0
git常见问题

一、clone代码 clone 1.登录账号密码不对 fatal: Authentication failed for 2.权限不足 Permission denied (publickey) 或者emote: User permission denied fatal: unable to access u......

hexiaoming123
34分钟前
1
0
Mybatis操作mysql 8的Json字段类型

Json字段是从mysql 5.7起加进来的全新的字段类型,现在我们看看在什么情况下使用该字段类型,以及用mybatis如何操作该字段类型 一般来说,在不知道字段的具体数量的时候,使用该字段是非常合...

算法之名
42分钟前
37
0
Windows7至Windows10的升级建议

目前,诸多企业或已开始在进行Windows7至Windows10的升级,或正在规划Windows7升级至Windows10。 主要原因有两个: Windows7的生命周期即将结束,这意味着再也无法获取Windows7的安全更新,以...

嘉为科技
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部