Python中的staticmethod和classmethod
谈谈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的更多相关文章
- (译文)Python中的staticmethod与classmethod
原文是stackoverflow的一则高票回答,原文链接 可能之前也有人翻译过,但是刚好自己也有疑惑,所以搬运一下,个人水平有限所以可能翻译存在误差,欢迎指正(如侵删). 尽管classmethod和 ...
- Python中的@staticmethod和@classmethod的区别
一直搞不明白,类方法和静态方法的区别,特意研究了一下,跟大家分享一下. 为了方便大家了解两者的差别,以下的示例代码将有助于发现其中的差别: class A(object): def foo(self, ...
- 关于python中的staticmethod
python中的staticmethod 主要是方便将外部函数集成到类体中,美化代码结构,重点在不需要类实例化的情况下调用方法 如果你去掉staticmethod,在方法中加self也可以通过实例化访 ...
- 【开发者笔记】python中的类方法(@classmethod)和静态方法(@staticmethod)
在java.c#等高级语言中我们用static来定义静态方法和静态变量,那么在python中如何定义静态方法和静态变量呢. python提供了@classmethod和@staticmethod来定义 ...
- python中静态方法(@staticmethod)和类方法(@classmethod)的区别
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...
- Python中的 @staticmethod@classmethod方法
python类中有三种方法,常见的是实例方法,另外两种是staticmethod装饰的静态方法,和classmethod装饰的类方法. 1.对比 流畅的python里,用一个例子进行了对比: (1)两 ...
- 关于python中的类方法(classmethod)和静态方法(staticmethod)
首先明确两点: a)python在创建类的时候,self指向的是类的实例而不是类属性! b)我们所创建的类的方法有两种作用,一种是改变类的属性,一种是改变实例的属性,这点一定要分清! c)我们在调用类 ...
- Python中的实例方法、classmethod和staticmethod的区别
class NewsPaper(object): # 类属性 __print_times = 0 # 下划线表示私有属性 # 实例方法 def __init__(self, title, conten ...
- Python OOP(3) staticmethod和classmethod统计实例
staticmethod 统计实例 #!python2 #-*- coding:utf-8 -*- class c1: amount_instance=0 def __init__(self): c1 ...
随机推荐
- Wannafly交流赛1 A 有理数[模拟/分类讨论]
链接:https://www.nowcoder.com/acm/contest/69/A来源:牛客网 题目描述 有一个问题如下: 给你一个有理数v,请找到小于v的最大有理数. 但这个问题的答案对于任意 ...
- Codeforces 915F Imbalance Value of a Tree(并查集)
题目链接 Imbalance Value of a Tree 题意 给定一棵树.求树上所有简单路径中的最大权值与最小权值的差值的和. 首先考虑求所有简单路径中的最大权值和. 对所有点按照权值大小升 ...
- 洛谷——P1462 通往奥格瑞玛的道路
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- 打包python脚本为exe
更新pip 安装
- inux 下的/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc 文件的作用
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取. ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的sh ...
- app中获取应用名称,版本等信息的方法
在app中,我们有时候需要显示一些信息,例如名称,版本等等...如果用写死的方式可能不太好,我们可以动态的读取.应用的信息主要是在info.plist这个文件中,实际就是一个xml文件,以源文件的方式 ...
- 高校师生福利!从现在起,可以免费申请LocaSpace和Wish3D的SDK!
目前,以管理空间数据见长的GIS已经在全球变化与监测.军事.资源管理.城市规划.土地管理.环境研究.灾害预测.交通管理.文物保护以及政府部门等许多领域发挥着越来越重要的作用. 如何开发出功能丰富又简洁 ...
- Linux命令之basename 命令
用途 返回一个字符串参数的基本文件名称. 语法 basename String [ Suffix ] 描述 basename 命令读取 String 参数,删除以 /(斜杠) 结尾的前缀以及任 ...
- 性能测试脚本开发(LR.NET控件)
性能测试过程中,最耗费经历的就是编写性能测试脚本的过程,在大部分的测试工具中都是采用录制的方式,通过录制产生脚本,然后根据需要进行修改,以及参数化.有些时候为了能够完成某一个功能的脚本,需要将录制下来 ...
- 【AngularJS】【03】使用AngularJS进行开发
看不到PPT的请自行解决DNS污染问题.