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检查URL是否正常访问的小技巧

    python检查URL是否正常访问的小技巧

    检查一个URL是否正常很容易,如果检查2000个URL,或者是大批量的URL怎么办?这篇文章就为大家介绍了python检查URL是否正常访问的小技巧,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • python 解决 pip 时报错 no suchoption: --bulid-dir 的解决办法(最新推荐)

    python 解决 pip 时报错 no suchoption: --bulid-dir 的解决办法(最新

    在使用PyCharm虚拟环境pip时,有时会遇到错误提示“no such option: --build-dir”,这可能是由于pip版本不兼容或其他原因导致的,本文将详细讲解如何解决这个问题,感兴趣的朋友跟随小编一起看看吧
    2023-05-05
  • 基于python分享一款地理数据可视化神器keplergl

    基于python分享一款地理数据可视化神器keplergl

    这篇文章主要介绍了分享一款地理数据可视化神器keplergl,keplergl是由Uber开源的一款地理数据可视化工具,通过keplergl我们可以在Jupyter notebook中使用,下文分享需要的小伙伴可以参考一下
    2022-02-02
  • python实现冒泡排序算法的两种方法

    python实现冒泡排序算法的两种方法

    本篇文章主要介绍了python实现冒泡排序的两种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Python中执行CMD命令的方法总结

    Python中执行CMD命令的方法总结

    在实际开发中,有时候我们需要在Python中执行一些系统命令(CMD命令),本文将详细介绍在Python中执行CMD命令的方法,并通过丰富的示例代码帮助大家更全面地理解这一过程,希望对大家有所帮助
    2023-12-12
  • Python海龟绘图之绘制趣味简笔画

    Python海龟绘图之绘制趣味简笔画

    大家好,本篇文章主要讲的是Python海龟绘图之绘制趣味简笔画,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Python字符串本身作为bytes进行解码的问题

    Python字符串本身作为bytes进行解码的问题

    这篇文章主要介绍了解决Python字符串本身作为bytes进行解码的问题,文末给大家补充介绍了,Python字符串如何转为bytes对象?Python字符串和bytes类型怎么互转,需要的朋友可以参考下
    2022-11-11
  • Python基于Socket实现简单聊天室

    Python基于Socket实现简单聊天室

    这篇文章主要为大家详细介绍了Python基于Socket实现简单聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Python 实现list,tuple,str和dict之间的相互转换

    Python 实现list,tuple,str和dict之间的相互转换

    这篇文章主要介绍了Python 实现list,tuple,str和dict之间的相互转换,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python Flask上下文管理机制实例解析

    Python Flask上下文管理机制实例解析

    这篇文章主要介绍了Python Flask上下文管理机制实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论