谈谈Python中的staticmethod和classmethod

首先值得说明的是staticmethod和classmethod都是python中定义的装饰器,用的时候需要在前面加@

即@staticmethod和@classmethod

翻译过来staticmethod是静态方法, classmethod是类方法

下面是一个简单的例子:

>>> v2 = "I'm out of class A"
>>> class A(object):
v1 = "I belong to class A"
def func(self,x):
print("executing func(%s,%s)" % (self,x))
@classmethod
def class_func(cls,x):
print("executing class_func(%s,%s)" % (cls,x))
print(cls.v1)
@staticmethod
def static_func(x):
print("executing static_func(%s)" % x)
print(v2) >>> a = A()
>>> a.func(1)
executing func(<__main__.A object at 0x00000075840ECB70>,1)
>>> a.class_func(2)
executing class_func(<class '__main__.A'>,2)
I belong to class A
>>> A.class_func(3)
executing class_func(<class '__main__.A'>,3)
I belong to class A
>>> a.static_func(4)
executing static_func(4)
I'm out of class A
>>> static_func(5)
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
static_func(5)
NameError: name 'static_func' is not defined
>>> A.static_func(5)
executing static_func(5)
I'm out of class A
>>> A.v1
'I belong to class A'

这里有个地方值得玩味。从字面意思上,我们就可以判断,很好理解。

在class A中:

  • 没有任何装饰器修饰的函数"func",是属于对象的方法,只能访问实例的其他成员。所以func(self,x)传入的第一个参数是"self",指的是实例本身,即例子中的a。只能通过实例调用。
  • classmethod是类的方法,即上例中用@classmethod修饰的函数"class_foo",是属于类的方法,所以class_foo(cls,x)传入的第一个参数是"cls",指类本身,即例子中的A。这个方法是一个类方法,虽然属于类,需要访问类的其他成员,但是不用访问实例的其他成员。并且可以在不把类实例化的前提下,通过类名进行调用,但是值得注意的是,classmethod也可以通过实例调用。典型用途:工厂模式的实现。
  • staticmethod是静态方法,即这个方法是一个普通方法,虽然属于类,但是不用访问类和实例的其他成员。并且可以在不把类实例化的前提下,通过类名进行调用值得注意的是,staticmethod也可以通过实例调用。典型用途:工厂模式的实现。

需要特别指出的一点是,上述指出的用法是标准用法。实际上,通过class A的定义我们看到,从实际的角度看,func, class_func和static_func都是在class A定义下的,也就是说,其实这三个函数我们都可以通过A来访问,严格意义上都是属于classA的成员函数,就算对象方法func也不例外。

其实语句执行时

a.func(1)

相当于默认执行了

A.func(a,1)

以下是证明:

>>> A.func(1,2)
executing func(1,2)
>>> A.func(A,1)
executing func(<class '__main__.A'>,1)
>>> A.func(a,1)
executing func(<__main__.A object at 0x00000075840ECB70>,1)
>>> a.func(1)
executing func(<__main__.A object at 0x00000075840ECB70>,1)

参考链接:

1. Python中的staticmethod与classmethod

2. python中@classmethod @staticmethod区别

Python中的staticmethod和classmethod的更多相关文章

  1. (译文)Python中的staticmethod与classmethod

    原文是stackoverflow的一则高票回答,原文链接 可能之前也有人翻译过,但是刚好自己也有疑惑,所以搬运一下,个人水平有限所以可能翻译存在误差,欢迎指正(如侵删). 尽管classmethod和 ...

  2. Python中的@staticmethod和@classmethod的区别

    一直搞不明白,类方法和静态方法的区别,特意研究了一下,跟大家分享一下. 为了方便大家了解两者的差别,以下的示例代码将有助于发现其中的差别: class A(object): def foo(self, ...

  3. 关于python中的staticmethod

    python中的staticmethod 主要是方便将外部函数集成到类体中,美化代码结构,重点在不需要类实例化的情况下调用方法 如果你去掉staticmethod,在方法中加self也可以通过实例化访 ...

  4. 【开发者笔记】python中的类方法(@classmethod)和静态方法(@staticmethod)

    在java.c#等高级语言中我们用static来定义静态方法和静态变量,那么在python中如何定义静态方法和静态变量呢. python提供了@classmethod和@staticmethod来定义 ...

  5. python中静态方法(@staticmethod)和类方法(@classmethod)的区别

    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...

  6. Python中的 @staticmethod@classmethod方法

    python类中有三种方法,常见的是实例方法,另外两种是staticmethod装饰的静态方法,和classmethod装饰的类方法. 1.对比 流畅的python里,用一个例子进行了对比: (1)两 ...

  7. 关于python中的类方法(classmethod)和静态方法(staticmethod)

    首先明确两点: a)python在创建类的时候,self指向的是类的实例而不是类属性! b)我们所创建的类的方法有两种作用,一种是改变类的属性,一种是改变实例的属性,这点一定要分清! c)我们在调用类 ...

  8. Python中的实例方法、classmethod和staticmethod的区别

    class NewsPaper(object): # 类属性 __print_times = 0 # 下划线表示私有属性 # 实例方法 def __init__(self, title, conten ...

  9. Python OOP(3) staticmethod和classmethod统计实例

    staticmethod 统计实例 #!python2 #-*- coding:utf-8 -*- class c1: amount_instance=0 def __init__(self): c1 ...

随机推荐

  1. MariaDB+Galera+Haproxy+Keepalived搭建集群

    1.MariaDB Galera Cluster介绍 MariaDB Galera Cluster是MariaDB同步多主机集群,它仅支持XtraDB/InnoDB存储引擎,在MySQLInnoDB存 ...

  2. Aizu 2304 Reverse Roads

    原题链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2304 题意: 给你一个网络,其中每条边的容量是1,你可以通过调整边的方向 ...

  3. POJ 3368 Frequent values 线段树与RMQ解法

    题意:给出n个数的非递减序列,进行q次查询.每次查询给出两个数a,b,求出第a个数到第b个数之间数字的最大频数. 如序列:-1 -1 1 1 1 1 2 2 3 第2个数到第5个数之间出现次数最多的是 ...

  4. cdq分治解决区间问题

    如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...

  5. 真正解决 thinkphp 验证码 出错 无法显示 问题

    今天做到验证码这一块想到tp自带验证图片  大喜单鼓捣半天不出来 一直是个小 X 官方提示:如果无法显示验证码,请检查:² PHP是否已经安装GD库支持:²输出之前是否有任何的输出(尤其是UTF8的B ...

  6. ThinkPHP3.1 模板布局

    ThinkPHP的模板引擎内置了布局模板功能支持,可以方便的实现模板布局以及布局嵌套功能.有三种布局模板的支持方式: 第一种方式:全局配置方式 这种方式仅需在项目配置文件中添加相关的布局模板配置,就可 ...

  7. hdu1061(C++)

    简单的找规律,不妨设N=10*x+a(a=N%10),那么N^N=(10*x+a)^N,用二项式展开定理可以知道N^N%10=a^N%10; 由于0<a<10,打表a^1,a^2,a^3, ...

  8. python tkinter GUI绘制,以及点击更新显示图片

    tkinter 绘制GUI简单明了,制作一些简单的GUI足够,目前遇到的一个问题是不能同时排列显示多幅图片(目前没找到同时显示解决方法), 退而求其次,改成增加一个update按钮,每次点下按钮自动更 ...

  9. windows8开发-关于wp7应用迁移到win8 metro风格

    虽然微软说,wp7应用移植到win8上面是比较简单,只需要修改部分API和设计原则上的细节,同时它也提供了一份比较简洁的参考文档: 而实际上这种移植的工作量还是不小的,尤其当应用引用了较多底层的API ...

  10. 社区之星礼品开箱——感谢CSDN

    前言 尽管已经看过国内外无数的开箱.评測视频,也看过无数国内社区的各种玩具.电子产品.摄影的分享贴.自己却从未写过--摄影水平有限以及懒-- 昨天看到上图的文章,看到最后都说了应该晒晒照片.写写博客, ...