• 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析


    第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

    静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供。
    一、    静态方法定义
    1.    语法
    @ staticmethod 
    def 方法名(参数):
    方法体
    2.    定义说明:
    1)    上述语法定义中,@ staticmethod 称为静态方法装饰器,凡是静态方法定义都必须有该装饰器。
    2)    静态方法与实例方法和类方法不同的是,没有类似self和cls这样的参数。某种程度上说,静态方法与一个类外面的函数类似。

    二、    静态方法的使用
    静态方法一般用在与实例和类的数据无关的场景,它提供的是一种类内的公共能力,也可以说是类内的一个与类和实例数据无关的一个类空间内的函数,静态方法实现的能力通过普通函数一样可以实现。
    在某些方面,静态方法和类方法是相同的,之所以用静态方法或类方法,而不用实例方法,是因为实例方法需要进行实例化后才能使用,而静态方法和类方法不需类实例化就可以使用,这样不会因为静态方法和类方法调用就需要执行实例化去消耗CPU和内存资源。
    那为什么不直接用函数呢?老猿认为,这是因为函数是在全局名称空间中创建的,如果多个成员的团队合作时,这种全局空间的函数可能会导致开发团队成员之间命名的冲突,而封装在类内就可以避免这种冲突,同时也更符合OOP的理念。
    静态方法具体使用的方式如下:
    1.    静态方法可以在所有类的方法中通过“类名.方法名”方式调用;
    2.    静态方法可以在类方法中通过“cls.方法名”方式调用;
    3.    静态方法可以在实例方法中通过“类名.方法名”方式调用;
    4.    静态方法可以在实例方法中通过“self.方法名”或“self.__class__.方法名”方式调用;
    1)    这种方式当类名可能修改时比直接用类名调用方便;
    2)    该访问方式可以用在构造方法等实例方法中,”self.方法名”可以用在重写的__new__方法中,但“self.__class__.方法名”不能用在重写的__new__方法中。
    a)    关于__ new__方法,相关内容在此不仔细介绍,大家可以到网上查一下资料,需要说明的是这也是一个实例定义时执行的方法,它在构造方法之前执行,一般不要重写该方法;
    b)    “self.__class__.方法名”不能用在重写的__new__方法中是因为此时实例还没创建完成,不能正确的获取到self.__class__的值(此时self.__class__的值为<class 'type'>),而静态方法与实例无关,因此“self.方法名”可以访问;
    c)    “self.__class__.方法名”是一种画蛇添足的方法,不如直接使用“self.方法名”,不推荐大家使用。
    5.    静态方法可以在类定义外的调用方代码中通过“类名.方法名”方式调用;
    6.    静态方法可以在类定义外的调用方代码中通过“实例名.方法名”方式调用;
    7.    静态方法可以在类定义外的调用方代码中通过“实例名. __class__.方法名”方式调用,这种方式有点画蛇添足,只是在此说明一种访问方法,并不推荐使用。

    从上面的使用情况介绍来说,静态方法的使用范围和类方法的使用范围是一样的,二者在这方面几乎没有差别。
    本节详细介绍了类中静态方法的定义和使用方法,可以看出类方法和静态方法共性特点比较多,与类方法的主要差别在于二者装饰器不同,方法对形参的要求不同,方法与类的关联程度不同,但是方法的定义、使用基本类似。下节将结合详细的案例演示相关内容。
    老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
    欢迎大家批评指正,谢谢大家关注!

  • 相关阅读:
    机器人走方格问题
    一道数列的规律题(使用递归解决)
    反转单链表
    求一个二叉树的深度以及如何判断一个二叉树是一个平衡二叉树
    打印素数
    DAY28-mysql扩展与预处理-查出问题的关键
    DAY31
    jQuery很简单很基础的
    JavaScript中的事件委托及好处
    结合个人经历总结的前端入门方法
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087697.html
Copyright © 2020-2023  润新知