classmethod与staticmethod区别
一、使用说明,以及为什么要使用?
好就是把他们放到一个类中,但是一个类每次我都要去实例化他,我觉得很麻烦,于是我在函数前面加上了@staticmethod,@classmethod,那么我下次用这个函数的功能的时候,可以直接用 类名.函数名 的形式了,这样是不是省心多了?
而使用@staticmethod或@classmethod,就可以不需要实例化,直接通过类名就可以实现调用
使用:直接类名.方法名()来调用
二、区别
@staticmethod不需要表示自身对象的self和自身类的cls参数(这两个参数都不需要添加),就跟使用函数一样。
使用:直接类名.属性名或直接类名.方法名。 # 直接类名,也可以直接类名( )
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
使用:直接类名.属性名或直接类名.方法名 # 直接类名,也可以直接类名( )
注:两者定义的装饰器调用方法一样,但是@classmethod装饰器定义的类方法需要传入类参数cls
三、区别实例:
#encoding:utf-8
#date:2019/9/25 17:09
#@Author:sunny
class Num(object):
num=520
def __init__(self):
self.age=18
print("init")
@classmethod
def classMth(cls):
print("我是classmethod")
@staticmethod
def staticMth():
print("我是staticmethod")
n=Num()
#调用初始化方法
Num.__init__(n)
n.__init__()
#调用静态方法
n.staticMth()
Num.staticMth()
#调用类方法
n.classMth()
Num.classMth()
#调用类属性
print(n.num)
print(Num.num)
#调用实例属性
print(n.age)
print(Num.age)
输出:
C:\Python34\python.exe E:/exercise/e2e_test/test/cls_not.py
Traceback (most recent call last):
init
File "E:/exercise/e2e_test/test/cls_not.py", line 38, in <module>
init
print(Num.age)
init
我是staticmethod
我是staticmethod
我是classmethod
我是classmethod
520
520
18
AttributeError: type object 'Num' has no attribute 'age'
Process finished with exit code 1
总结:
执行完后的结果,第一个init是创建对象后执行的
由上面不难发现,前面几个都可以,唯独最后一行出现程序崩溃情况,说明最后一个类调用实例属性出现错误,由此可知,类可以调用实例方法、静态方法、类方法和类属性,但是不能调用实例属性,实例对象可以调用实例方法、类方法、静态方法、类属性和实例属性的,总结起来就是下面一句话。
实例对象能调用以上列举的所有方法和属性,
而类除了不能调用实例属性,其他的方法和属性都能调用。
善于跌倒仍喜爱奔跑~

浙公网安备 33010602011771号