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打开网页和暂停实例,涉及webbrowser模块与os模块的使用,是非常具有实用价值的一个技巧,需要的朋友可以参考下
    2014-09-09
  • 解决python中使用PYQT时中文乱码问题

    解决python中使用PYQT时中文乱码问题

    今天小编就为大家分享一篇解决python中使用PYQT时中文乱码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python中导入 train_test_split提示错误的解决

    python中导入 train_test_split提示错误的解决

    这篇文章主要介绍了python中导入 train_test_split提示错误的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 使用python切片实现二维数组复制示例

    使用python切片实现二维数组复制示例

    今天小编就为大家分享一篇使用python切片实现二维数组复制示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python中如何将Tqdm与Asyncio结合使用呢

    Python中如何将Tqdm与Asyncio结合使用呢

    这篇文章主要和大家详细介绍了在Python中如何将Tqdm与Asyncio结合使用呢,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • Django框架用户注销功能实现方法分析

    Django框架用户注销功能实现方法分析

    这篇文章主要介绍了Django框架用户注销功能实现方法,结合实例形式分析了基于Django框架的删除cookie实现用户注销功能的相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • 分分钟入门python语言

    分分钟入门python语言

    分分钟学会一门语言之Python篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Python处理HTTP认证的常见方法

    Python处理HTTP认证的常见方法

    在Python中,HTTP认证通常指的是客户端在向服务器发送请求时,需要提供某种形式的认证信息,处理HTTP认证通常涉及到使用requests库,requests库提供了简单的方式来处理需要认证的HTTP请求,本文给大家介绍了Python处理HTTP认证的常见方法
    2025-03-03
  • Python语言描述最大连续子序列和

    Python语言描述最大连续子序列和

    这篇文章主要介绍了Python语言描述最大连续子序列和,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • Python实现王者荣耀自动刷金币的完整步骤

    Python实现王者荣耀自动刷金币的完整步骤

    这篇文章主要介绍了Python实现王者农药自动刷金币的完整步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论