作为一个初学者,最近在staticmethod与classmethod这里卡坑了,静态方法和类方法都可以通过类名加方法名或属性名来访问实例,但是他们区别何在,实际的运用场景何在?网上有很多文章说了等于白说,
于是我思考了一个小时,终于懂了,现在把所发现的分享下:
@classmethod
根据Python文档的说明,classmethod(fn)表明函数fn是类的函数而非类实例的函数,在语法上,它要求fn的函数签名至少要有1个参数,函数被调用时,解释器会将类作为第1个参数传给fn(这段摘抄)
@staticmethod
根据Python文档的说明,staticmethod(fn)表明函数fn是类的静态方法。具体到类定义体内某个函数的定义上,如果该函数想声明称静态成员,则只需在其定义体前加上”@staticmethod”这行,
利用装饰器语法糖来实现staticmethod(cls.fun)的目的(这段也摘抄)
那么哪些场景下staticmethod与classmethod不能互换呢?
当staticmethod与classmethod下的方法里包含了当前类的非绑定属性或方法时,并且这个类被继承了成为基类,然后基类因为某些原因被删除了,那么staticmethod与classmethod就不能互换着用了,举个例子:
class Fuck:
sex = '每日一撸' #这就是非绑定的属性
@staticmethod
def sta():
return Fuck.sex
@classmethod
def cla(cls):
return cls.sex #@classmethod里面必须要传入一个参数,这个参数代表就是当前的类
class Fuck_everybody(Fuck): #因为Fuck_everybody继承了父类Fuck,所以Fuck_everybody可以调用父类的sta()方法与cla()方法
pass
Fuck_everybody.sta()
'每日一撸'
Fuck_everybody.cla()
'每日一撸'
#然后我突然不爽,把Fuck删掉了
del Fuck
#那么,你再试试
Fuck_everybody.sta()
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
Fuck_everybody.sta()
File "<pyshell#18>", line 5, in sta
return Fuck.sex
NameError: name 'Fuck' is not defined
Fuck_everybody.cla() #类方法还是可以照样执行的
'每日一撸'
现在知道他们的区别了吗?
再举个例子,下面的例子说明什么情况下staticmethod比classmethod更加合适,如果我想对非绑定属性做出操作,比如相像非绑定的列表添加元素的话,用staticmethod来实现的话:
class Porn:
url = ['1024']
@staticmethod
def sta(new_url):
Porn.url.append(new_url)
return Porn.url
Porn.sta('91porn')
['1024', '91porn']
#用classmethod来实现的话:
class Porn:
url = ['1024']
@classmethod
def cla(cls,new_url):
cls.new_url = new_url
cls.url.append(new_url)
return cls.url
Porn.cla('91porn')
['1024', '91porn']
#使用普通的方法(姑且那么叫吧)来实现的话:
class Porn:
url = ['1024']
def normal(self,new_url):
self.new_url = new_url
self.url.append(self.new_url)
return self.url
porn = Porn()
porn.normal('91')
['1024', '91']
你会发现,虽然classmethod与普通方法原理上不一样,但是思路非常的相像,在这里,个人认为staticmethod更加能够让别人一眼看出你所要表达的逻辑,但是不推荐用staticmethod,像前面所举例的,
如果有一个子类继承了他,然后父类删了了,那么子类的这个方法就会报错
以上就是一个小白对staticmethod与classmethod所浅浅的认识,文章中有很多用词不规范的地方,不要受我误导了(滑稽.jpg),在不久的将来,当随着我学习的深入,对python的更加深入的理解,我会举出更好的
例子,如果这篇文章对你有帮助,那我也会很开心的