0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python中普通方法、静态方法、类方法的区别

科技绿洲 来源:AirPython 作者:AirPython 2023-11-02 11:03 次阅读

1. 场景

前几天,有一个小伙伴过来问我,Python 中的 @staticmethod、@classmethod、self、cls 分别代表什么意思,自己平时光顾着用,不知道具体的含义?

事实上,由于 Python 语言的灵活性,这部分内容在日常编码过程中,很容易被忽略掉

本篇文章将和大家一起聊聊这几个小知识点

2.@staticmethod

装饰器 @staticmethod 修饰的方法称为:静态方法,和普通的函数没有什么区别

下面将聊聊实际项目中几种应用场景

1、要调用一个静态方法,一般使用形式是:「 类名.方法名() 」

class Web(object):
    @staticmethod
    def foo_staticmethod():
        """静态方法"""
        pass


if __name__ == '__main__':
    # 直接使用类名+方法名调用
    Web.foo_staticmethod()

当然,也可以实例化一个类对象,通过这个对象去调用静态方法,但是不建议使用这种方式

# 实例化一个对象
instance = Web()

# 使用实例对象去调用静态方法(不建议)
instance.foo_staticmethod()

2、针对类中定义的静态变量,可以使用「 类名.变量名 」 的形式去访问

class Web(object):
    # 静态变量(类变量)
    name = "Python_Web"

    @staticmethod
    def foo_staticmethod():
        """静态方法"""
        # 引用静态变量
        print(Web.name)

3、静态方法内部使用其他静态方法、类方法,同样是使用「 类名.方法名() 」去调用

class Web(object):
    # 静态变量(类变量)
    name = "Python_Web"

    # 类方法
    @classmethod
    def foo_classmethod_other(cls):
        print('类方法被调用!')

    # 另外一个静态方法
    @staticmethod
    def foo_staticmethod_other():
        print('另外一个静态方法被调用!')

    @staticmethod
    def foo_staticmethod():
        """静态方法"""
        # 调用其他静态方法
        print(Web.foo_staticmethod_other()) 

        # 调用类方法
        print(Web.foo_classmethod_other())

4、静态方法内部调用普通方法,访问实例属性

普通方法和实例属性都必须通过实例对象去引用,不能直接使用类名去访问

class Web(object):
    def __init__(self):
        self.desc = "实例属性,不共享"

    def norm_method(self):
        """普通方法"""
        print('普通方法被调用!')

    @staticmethod
    def foo_staticmethod():
        """静态方法"""
        instance = Web()

        # 获取实例属性
        print(instance.desc)

        # 调用普通方法
        instance.norm_method()

5、子类的使用

在子类中调用父类定义好的静态方法,只需要将类名替换为子类名称即可

class Web(object):

    @staticmethod
    def foo_staticmethod(arg1, arg2):
        pass

class Django(Web):
    """子类"""
    pass

if __name__ == '__main__':
    # 1、使用类名(父类)去调用静态方法
    Web.foo_staticmethod("Hello", ",AirPython")

    # 2、使用类名(子类)去调用静态方法
    Django.foo_staticmethod("Hello", ",AirPython")

3.@classmethod

装饰器 @classmethod 修饰的方法称为:类方法,在使用的时候,会将类本身作为第一个参数 cls 传递给类方法

# 类方法,第一个参数为cls,代表类本身
@classmethod
def foo_classmethod(cls):
    pass

其中,cls 代表外层类本身,可以实例化,也可以直接调用静态方法、类方法、静态变量

下面逐一进行说明

1、要调用一个类方法,一般使用形式是:「 类名.方法名() 」

class Web(object):

    # 类方法,第一个参数为cls,代表类本身
    @classmethod
    def foo_classmethod(cls):
        pass

if __name__ == '__main__':
    # 使用类名去调用类方法
    Web.foo_classmethod()

和静态方法类似,也可以实例化一个类对象,通过这个对象去调用静态方法,但是不建议使用这种方式

2、调用静态变量

静态方法内部引用静态变量有两种方式,分别是:

  • 「 类名.变量名 」
  • 「 cls.变量名 」

注意:由于 cls 代表就是外层类本身,所以这两种方式等效

class Web(object):
    # 静态变量(类变量)
    name = "Python_Web"

    # 类方法,第一个参数为cls,代表类本身
    @classmethod
    def foo_classmethod(cls):
        # 调用静态变量方式一
        print(cls.name)

        # 调用静态变量方式二
        print(Web.name)

3、类方法内部调用其他类方法、静态方法

在一个类方法内部,可以使用「 类名.类方法名() 」、「 类名.静态方法名() 」的形式去调用方法

class Web(object):

    # 静态方法
    @staticmethod
    def foo_staticmethod():
        print('静态方法被调用!')

    # 其他类方法
    @classmethod
    def foo_classmethod_other(cls):
        print('另外一个类方法被调用!')

    # 类方法,第一个参数为cls,代表类本身
    @classmethod
    def foo_classmethod(cls):
        # 调用其他类方法
        cls.foo_classmethod_other()

        # 调用静态方法
        cls.foo_staticmethod()


if __name__ == '__main__':
    Web.foo_classmethod()

4、类方法内部调用普通方法,访问实例属性

需要通过 cls 变量实例化一个类对象,然后通过这个对象去调用普通方法和实例属性

class Web(object):

    def __init__(self):
        self.desc = "实例属性,不共享"

    def norm_method(self):
        """普通方法"""
        print('普通方法被调用!')

    # 类方法,第一个参数为cls,代表类本身
    @classmethod
    def foo_classmethod(cls):
        # 如果要调用实例属性,必须使用cls实例化一个对象,然后再去引用
        print(cls().desc)

        # 如果要调用普通方法,必须使用cls实例化一个对象,然后再去引用
        cls().norm_method()

5、子类的使用

在子类中调用父类定义好的类方法,只需要将类名替换为子类名称即可,代码和静态方法类似

4.区别

下面总结一下普通方法、静态方法、类方法的区别

  • 普通方法:第一个参数 self 代表实例对象本身,可以使用 self 直接引用定义的实例属性和普通方法;如果需要调用静态方法和类方法,通过「 类名.方法名() 」调用即可
  • 静态方法:使用「 类名.静态变量 」引用静态变量,利用「 类名.方法名() 」调用其他静态方法和类方法;如果需要调用普通方法,需要先实例化一个对象,然后利用对象去调用普通方法
  • 类方法:第一个参数 cls 代表类本身(等价),通过「 cls.静态变量 」或「 类名.静态变量 」引用静态变量,利用「 cls.方法名() 」或「 类名.方法名() 」去调用静态方法和类方法;如果需要调用普通方法,需要先实例化一个对象,然后利用对象去调用普通方法
  • 静态方法和类方法是针对类定义的,除了可以使用类名去调用,也可以使用实例对象去调用,但是不建议

5.最后

一般来说,如果方法内部涉及到实例对象属性的操作,建议用普通方法;如果方法内部没有操作实例属性的操作,仅仅包含一些工具性的操作,建议使用静态方法;而如果需要对类属性,即静态变量进行限制性操作,则建议使用类方法

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码
    +关注

    关注

    6

    文章

    835

    浏览量

    54457
  • 函数
    +关注

    关注

    3

    文章

    3881

    浏览量

    61310
  • 静态
    +关注

    关注

    1

    文章

    27

    浏览量

    14481
  • python
    +关注

    关注

    51

    文章

    4676

    浏览量

    83467
收藏 人收藏

    评论

    相关推荐

    动态库封装成python模块的方法

    之前的文章 将静态库封装成 python 模块中讲解了如何将静态库封装成 python 模块,静态库封装相对来说还是有点复杂,今天来介绍下动
    发表于 07-13 15:24 380次阅读

    python模块安装方法

    Python模块呢?import语句自定义模块可以采用import语句来进行引入,其操作步骤是先导入模块,再调用模块包含的函数,可将自定义模块放入当前目录,便于解释器路径搜索,以下是导入自定义
    发表于 04-04 14:57

    Python多重继承使用方法

    执行父的__init__(self)方法;3. 下划线开头的变量或方法,会被认为是受保护的,不能直接点出来,但如果强制打出来的话也一样能用,只是会有警告;4. 静态
    发表于 04-19 14:41

    Python常用Selenium方法封装是什么

    Python,常用Selenium方法封装(4)
    发表于 05-18 12:03

    如何使用Python? 优势有哪些?

    的下面有属性和方法。可以将属性理解为静态的数据,将方法理解为动态的处理函数。比如,在下面的代码定义了“学生”,其中_ _init_ _是
    发表于 07-30 18:08

    Python方法、实例方法静态方法

    Python实例属性和实例方法Python类属性和方法
    发表于 11-05 06:25

    请问Python方法、实例方法静态方法是什么?

    Python方法、实例方法静态方法
    发表于 11-09 07:13

    传统静态配置方法与动态配置方法区别在哪?

    传统静态配置方法有什么缺点?MAC地址和IP地址的动态配置方法是什么?传统静态配置方法与动态配置方法
    发表于 05-27 06:51

    python静态方法方法

    ;)小黑跳起来啦2. 方法与函数区别在前面,我们很经常提到方法和函数,为免有同学将他们混为一谈,我这里总结一下他们的区别。在 Python
    发表于 03-07 16:56

    python私有变量和私有方法

    python私有变量和私有方法1. 下划线妙用在 Python ,下划线可是非常推荐使用的符号:变量名推荐使用下划线分隔的蛇形命名法魔法方法
    发表于 03-08 16:30

    python执行函数的九种方法

    post_taskrunning pre_taskrunning taskrunning post_task方法四:使用 getattr 动态获取执行若把所有的函数是放在,并定义成静态
    发表于 03-29 17:43

    python判断是否包含子串的7种方法

    ;lol" in "hello, python"False2、使用 find 方法使用 字符串 对象的 find 方法,如果有找到子串,就可以返回指定子串在字符串的出现位置
    发表于 04-08 15:15

    ASIC静态验证方法

    介绍了基于深亚微米 CMOS 工艺A S IC 电路设计流程中的静态验证方法。将这种验证方法与以往的动态验证方法进行了比较, 结果表明, 前者比后者更加高效和准确。由此可以说明,
    发表于 06-21 15:05 0次下载
    ASIC<b class='flag-5'>静态</b>验证<b class='flag-5'>方法</b>

    python基础教程之如何进行静态方法和类方法详细笔记说明

    本文档的主要内容详细介绍的是python基础教程之如何进行静态方法和类方法详细笔记说明资料免费下载。
    发表于 01-04 17:01 17次下载
    <b class='flag-5'>python</b>基础教程之如何进行<b class='flag-5'>静态</b><b class='flag-5'>方法</b>和类<b class='flag-5'>方法</b>详细笔记说明

    python静态方法与类方法

    python静态方法与类方法 1. 写法上的差异 类的方法可以分为: 静态
    的头像 发表于 03-07 16:56 1320次阅读