一个小白对staticmethod与classmethod区别的理解,绝对简单易懂

作为一个初学者,最近在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的更加深入的理解,我会举出更好的
例子,如果这篇文章对你有帮助,那我也会很开心的

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值