python之 @staticmethod 和 @classmethod

🍖🍖🍖🍖 作者 : 不良使
🍖🍖🍖🍖🍖 潜力创作新星 华为云享专家
🍖🍖🍖🍖🍖🍖 博客记录学习的思路,项目和错误,寻找志同道合的朋友
🍖🍖🍖🍖🍖🍖🍖 如果觉得有帮助记得一键三连 ┗|`O′|┛ 嗷~~


在这里插入图片描述

🍓🍓引言

这篇文章是我对python里面的静态方法(staticmethod) 和 类方法(classmethod)的一些见解,希望能够帮助到大家。在准备写这篇文章之前我也是很迷茫,总是不理解,得过且过,能看懂代码就行,反正又不常用,就没放在心上。但是最近由于项目需要,满屏的静态方法和类方法属实让我有点迷茫,怎么办,想要继续下去,那就只有学了。不逼自己一把,永远不知道自己的潜力有多大。

一个比较简单粗暴的区分方式:要决定是使用@staticmethod还是@classmethod,你必须看看类方法内部。如果你的方法访问了类中的其他变量/方法,那么就使用@classmethod。另一方面,如果方法没有接触到类中的任何其他变量,那么就使用@staticmethod。
但是其设计有更深的逻辑联系:
classmethod主要用于替代构造函数。
staticmethod不使用对象的状态,甚至不使用类本身的结构。它可以是一个类外部的函数。它只放在类的内部,用于分组具有类似功能的函数(例如,像Java的数学类静态方法)

@classmethod
Person.printAge = classmethod(Person.printAge)

@staticmethod
Calculator.add_numbers = staticmethod(Calculator.add_numbers)

能看懂这两行代码,应该就能理解什么是静态方法,什么是类方法了吧。当然,看的不太懂也没有关系,下面通过栗子来详细的解说一下\

在这里插入图片描述

🍓🍓@classmethod

🍄🍄什么是类方法?

什么是类方法?
类方法是绑定到类而不是其对象的方法。它不需要创建类实例,就像staticmethod 一样。

静态方法和类方法之间的区别在于:

静态方法对类一无所知,只处理参数
类方法适用于类,因为它的参数始终是类本身。
类方法可以由类及其对象调用。

Class.classmethod()
Class().classmethod()

但无论如何,class方法始终附加到一个类,其中第一个参数作为类本身。cls

def classMethod(cls, args…)


🍄🍄例子1

代码:


class Person:
    age = 25
    def printAge(cls):
        print('The age is:', cls.age)
Person.printAge = classmethod(Person.printAge)

Person.printAge()

结果:
在这里插入图片描述


代码:

class Person:
    age = 25
    @classmethod
    def printAge(cls):
        print('The age is:', cls.age)

Person.printAge()

结果:
在这里插入图片描述

你会发现改变了代码,但是结果还是一样的。你细心就会有所发现,没错,代码中的
****@classmethod等价于Person.printAge = classmethod(Person.printAge)

实例方法可以调用实例方法、类方法、静态方法。类对象只能调用类方法、静态方法。

classmethod与staticmethod用法类似,classmethod可以通过staticmethod代替,在通过类调用时,这两者对于调用者来说是不可区分的。这两者的区别在于,classmethod增加了一个对实际调用类的引用。
🥭🥭方法可以判断出自己是通过基类被调用,还是通过某个子类被调用
🥭🥭通过子类调用时,方法可以返回子类的实例而非基类的实例
🥭🥭通过子类调用时,方法可以调用子类的其他classmethod







觉得有用的可以给个三连,关注一波!!!带你了解更多的python小知识

  • 19
    点赞
  • 22
    收藏
  • 打赏
    打赏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:岁月 设计师:pinMode 返回首页
评论 29

打赏作者

不良使

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值