我们在看一些代码的时候经常会看到这两个方法,今天是仔细的看了一下,终于搞清楚了,我们还是使用代码来说吧,先上一些概念。
一般来说,我们在操作方法实现某些功能的时候,都是先实例化一个对像,然后再调用方法。但是使用@staticmethod或@classmethod,对类方法进行修饰后就可以不需要实例化,同时可以直接使用类名.方法名()来调用。
被@classmethod修饰的方法叫类的静态方法,个人觉得使用的很少,因为应用场景不大,即不能调用类法方,又不能调用类属性。但是它依旧可以被类的实例调用@classmethod修饰的方法叫类的方法,好处就是不需要实例化就可以直接调用自己。
相同:
使用类名.方法名()来调用
区别:
被@classmethod修饰的方法,没有self自身参数,只能普通函数一样调用
被@classmethod修饰的方法也不需要self参数,但第一个参数需要是表示自身类的cls参数(实际上改成其他名字好像也可能,但是大家都叫这个,我们也就习惯了这个,别人都叫北京鸟巢,你非得说他是北京大碗,但实际做为体育錧功能一点没有变)。
这里还有个特别的点在有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。我我们写写代码加深一下印象吧。
class C():hobby = "蛙泳"def eat(self):print("吃太多会胖,我爱"+self.hobby)@staticmethoddef run():print("跑步是减肥利器"+C.hobby)@classmethoddef swim(cls):print("游泳才是最好减肥,没有之一"+cls.hobby)class D(C):hobby = "蝶泳"c=C()
print(c.run()) #--->跑步是减肥利器
C.run()#--->跑步是减肥利器蛙泳
c.eat()#--->吃太多会胖,我爱蛙泳
c.swim() #-->游泳才是最好减肥,没有之一蛙泳
C.swim()#-->游泳才是最好减肥,没有之一蛙泳
#----------------看重点--------------------------
D.swim()#--->游泳才是最好减肥,没有之一蝶泳
D.run()#-->跑步是减肥利器蛙泳