Python中类方法@classmethod和静态方法@staticmethod解析

 更新时间:2023年08月24日 10:53:35   作者:goodxin_ie  
这篇文章主要介绍了Python中类方法@classmethod和静态方法@staticmethod解析,python中存在三种方法,分别为常规方法(定义中传入self)、@classmethod修饰的类方法、@staticmethod修饰的静态方法,,需要的朋友可以参考下

一、python中的方法

python中存在三种方法,分别为常规方法(定义中传入self)、@classmethod修饰的类方法、@staticmethod修饰的静态方法。

class A(object):
    num = 0
    def __init__(self, index = 0):
        self.index = index 
    def foo(self, x):
        print("executing foo(%s,%s)" % (self, x))
        print('self:', self)
    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s,%s)" % (cls, x))
        print('cls:', cls.num)
    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % x)
a = A()

以上面的代码为例,其中存在三种类型的方法。

1.常规方法foo()

常规方法定义时需要传入self参数,与类的实例绑定。

也就是说调用时需要先实例化类,然后该实例才拥有foo()方法,通过A().foo()的方式来调用。

不能直接用类A.foo()的方式来调用。

2.类方法class_foo()

用@classmethod修饰的方法需要传入cls参数(代表当前类),表示该方法与类绑定(不是实例)

在该函数内部可以调用属于类的专有属性(一般来说定义在__init__外面的属性如上面的num)。

可以直接用A.class_foo()来调用,当然也可以直接实例化,通过实例来调用。

3.静态方法static_foo()

用@staticmethod修饰的方法不需要传入任何参数

该方法内部不能访问类或者实例的属性,相当于定义在类外面的普通方法。

可以直接用A.static_foo()来调用或者通过实例来调用。

二、@classmethod和@staticmethod的异同

相同点:

  • 都可以直接用类名.方法(A.xx())的方式来访问,也可以通过实例来访问

不同点:

  • 构造时classmethod需要传入cls参数,staticmethod不需要
  • classmethod可以通过cls.来访问类的专有属性,staticmethod不能访问类的属性
  • classmethod可以被子类继承,能够判断出是父类还是子类调用

三、使用场景

1.classmethod用在构造前交互(即类实例化之前),一般是用来实现特殊的构造函数。

e.g我们定义了Date类,需要提供day,month,year三个参数进行初始化。

class Date(object):
    day = 0
    month = 0
    year = 0
    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

但是如果我们有很多 ('dd-mm-yyyy') 格式字符串的日期信息,想要把它们创建成 Date 类实例。

此时我们需要将 ('dd-mm-yyyy')转化成三个整形变量

然后 通过传递这些值实例化 Date。

我们当然可以在函数外面做转化的事,然后去实例化

如下:

day, month, year = map(date_as_string.split('-'))
date1 = Date(day, month, year)

但是很明显转化这个功能放在类里面美观一点,但是一般的方法需要类实例化之后(调用了__init__之后)才可以使用,因此这里需要使用@classmethod

class Date(object):
    day = 0
    month = 0
    year = 0
    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year
    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1
date2 = Date.from_string('11-09-2012')

通过date2 = Date.from_string('11-09-2012')这样的方式就可以生成一个实例了。

2.某些不与实例交互的方法

不与实例交互就可以完成功能的方法虽然可以通过普通的实例化方法实现

但是实例化之后会浪费更多的时间与空间。

因此使用staticmethod。

ps:staticmethod方法和一个定义在lei外面的函数没啥区别,为了美观和整洁才移到函数里面的。

到此这篇关于Python中类方法@classmethod和静态方法@staticmethod解析的文章就介绍到这了,更多相关Python类方法和静态方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python答题卡识别并给出分数的实现代码

    Python答题卡识别并给出分数的实现代码

    本文带领大家学习Python答题卡识别并给出分数的实现代码,代码实现思路清晰,简单易懂,Python识别答题卡相关知识感兴趣的朋友一起看看吧
    2021-06-06
  • python pandas 组内排序、单组排序、标号的实例

    python pandas 组内排序、单组排序、标号的实例

    下面小编就为大家分享一篇python pandas 组内排序、单组排序、标号的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Linux下Python获取IP地址的代码

    Linux下Python获取IP地址的代码

    这篇文章主要介绍了Linux下Python获取IP地址的代码,需要的朋友可以参考下
    2014-11-11
  • 解决pandas中读取中文名称的csv文件报错的问题

    解决pandas中读取中文名称的csv文件报错的问题

    今天小编就为大家分享一篇解决pandas中读取中文名称的csv文件报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Flask实现跨域请求的处理方法

    Flask实现跨域请求的处理方法

    这篇文章主要介绍了Flask实现跨域请求的处理方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • python+django+selenium搭建简易自动化测试

    python+django+selenium搭建简易自动化测试

    这篇文章主要介绍了python+django+selenium搭建简易自动化测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 详解如何用Python登录豆瓣并爬取影评

    详解如何用Python登录豆瓣并爬取影评

    这篇文章主要介绍了如何用Python登录豆瓣并爬取影评,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Python基础篇之字符串方法总结

    Python基础篇之字符串方法总结

    Python提供了丰富的字符串处理方法,可以方便地对字符串进行操作、处理和转换。在本文中,我们将介绍Python中常用的字符串方法,需要的可以参考一下
    2023-04-04
  • Python线性网络实现分类糖尿病病例

    Python线性网络实现分类糖尿病病例

    什么是线性规划?想象一下,您有一个线性方程组和不等式系统。这样的系统通常有许多可能的解决方案。线性规划是一组数学和计算工具,可让您找到该系统的特定解,该解对应于某些其他线性函数的最大值或最小值
    2022-10-10
  • Python入门教程(十一)Python中的运算符

    Python入门教程(十一)Python中的运算符

    这篇文章主要介绍了Python入门教程(十一)Python中的运算符,Python是一门非常强大好用的语言,也有着易上手的特性,本文为入门教程,需要的朋友可以参考下
    2023-04-04

最新评论