原文:https://blog.csdn.net/youngbit007/article/details/68957848

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youngbit007/article/details/68957848
classmethod:类方法
staticmethod:静态方法

在Python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:

@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。

普通对象方法至少需要一个self参数,代表类对象实例

类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。

对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。

静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少

classmethod必须使用类对象作为第一个参数,而staticmethod则可以不传递任何参数。

class Date:

def __init__(self,day=0, month=0, year=0):
self.day=day
self.month = month
self.year = year

@classmethod
def from_string(cls, date_as_string):
day, month, year = map(int,date_as_string.split('-'))
my_date = cls(day, month, year)
return my_date

@staticmethod
def is_date_valid(date_as_string):
day, month, year = map(int, date_as_string.split('-'))
return day <= 31 and month <= 12 and year <= 3999

if __name__ == '__main__':
my_date = Date.from_string('11-09-2012')
print(my_date.day, my_date.month,my_date.year)
is_date = Date.is_date_valid('13-13-2012')
print(is_date)

outputs:
11 9 2012
False
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
在来看另外的例子,为了验证有子类继承时,子类调用该类方法时,传入的类变量cls是子类,而非父类

class A:
@classmethod
def cm(cls):
print('类方法cm(cls)调用者:', cls.__name__)

@staticmethod
def sm():
print('静态方法sm()被调用')

class B(A):
pass

A.cm() # 类方法cm(cls)调用者: A
B.cm() # 类方法cm(cls)调用者: B
A.sm() # 静态方法sm()被调用
B.sm() # 静态方法sm()被调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
下面我们来看为什么要用到staticmethod与classmethod。

class Kls:
def __init__(self,data):
self.data = data
def printd(self):
print(self.data)

ik1=Kls('arun')
ik2=Kls('seema')
ik1.printd()
ik2.printd()

# 如果现在我们想写一些仅仅与类交互而不是和实例交互的方法会怎么样呢? 我们可以在类外面写一个简单的方法来做这些,
# 但是这样做就扩散了类代码的关系到类定义的外面. 如果像下面这样写就会导致以后代码维护的困难:
def get_no_of_instances(cls_obj):
return cls_obj.no_inst
class Kls:
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print(get_no_of_instances(Kls)) # 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
应用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())
# 2
# 2
1
2
3
4
5
6
7
8
9
10
11
12
13
@staticmethod
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法

最新文章

  1. css3线条围绕跑马+jquery打字机效果
  2. VMWARE修改CPUID
  3. 利用PHP从淘宝采集评论和成交数据
  4. ios 使用xib时,在UIScrollView中添建内容view时,使用约束的注意
  5. 受限玻尔兹曼机(RBM)学习笔记(五)梯度计算公式
  6. Hadoop系统架构
  7. Codeforces Round #368 (Div. 2) A. Brain&#39;s Photos (水题)
  8. 在sql语句中使用plsql变量
  9. 【转】Android ListView长按事件触发点击事件
  10. Bitmap工具类
  11. android——fragment长时间home或者锁屏java.lang.IllegalArgumentException:No view found for id for....
  12. 好记性不如烂笔头85-spring3学习(6)-BeanFactory 于bean生命周期
  13. 必要的软件架构师——编译原理&amp;#183;语法
  14. Linux如何安装VMware Tools
  15. Lintcode223 Palindrome Linked List solution 题解
  16. RxJava操作符(02-创建操作)
  17. 我们用整整三年时间,建成了一套软件:用户定制系统(UD)
  18. Python实现进度条总结
  19. Threaten Model
  20. Linux:tree命令详解

热门文章

  1. IE 8 浏览器 F12 调试功能无法使用
  2. s4-6 二层交换
  3. 【王者荣耀之IT大神版】比赛制度说明(匹配赛、排位赛、赏金赛)
  4. 用IrisSkin2.dll美化你的WinForm
  5. java web 怎么下载大文件(上百M)
  6. winSockets编程(二)socket函数
  7. android:padding和android:margin的区别[转]
  8. Flash网页小游戏开发教程
  9. quartz之hello(java)
  10. hdu 5073 有坑+方差贪心