第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的世界。
欢迎大家批评指正,谢谢大家关注!
第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析的更多相关文章
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- 第7.14节 Python类中的实例方法详析
第7.14节 Python类中的实例方法详析 一. 实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1. 类体中定义实例方法 第一种方式很简单,就是在类体 ...
- 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑
上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- 第8.9节 Python类中内置的查看直接父类的__bases__属性
终于介绍完了__init__方法和__new__方法,接下来轻松一下,本节介绍类中内置的__bases__属性. 一. 语法释义 Python 为所有类都提供了一个 bases 属性,通过该属性可以查 ...
- 第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义
一. 引言 在本博前面的内容都对构造方法__init__进行了介绍,也在前面章节引入了__new__方法,但老猿认为__new__方法比构造方法__init__更应该属于构造方法.这是因为在Py ...
- 第8.14节 Python类中内置方法__str__详解
一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...
- python语言中的函数装饰器
装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具 在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...
- 第7.10节 Python类中的实例变量定义与使用
一. 引言 在前面章节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享 ...
随机推荐
- 14 RPC
14 RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...
- 关于layui图片/文件上传
一:常规使用 普通文件上传 (传入服务器一张图片) 1.前台代码: <!DOCTYPE html><html><head> <meta charset=& ...
- 跟我一起学Redis之Redis事务简单了解一下
前言 关系数据库中的事务,小伙伴们应该是不陌生了,不管是在开发还是在面试过程中,总有两个问题逃不掉: 说说事务的特性: 事务隔离级别是怎么一回事? 事务处理不好,数据就可能不准确,最终就会导致业务出问 ...
- Redis学习(一)——初识Redis
1.Redis是什么 1)REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. 2)Redis的特点 Red ...
- Docker UnicodeEncodeError: 'ascii' codec can't encode characters in position
在容器里查询nova服务的时候字符集报错问题留档及处理方法: 1.在容器里执行nova list --all 提示 [root@stack1 region_01]# nova list --all E ...
- 【webSocket】实现原理
服务端文件: import base64 import hashlib import socket # 将请求头格式化成字典 def get_headers(data): ""&q ...
- 储存与RAID--独立磁盘阵列
存储: 专门用来插硬盘的机器,作用是增加插口,可以多插硬盘. 这种有策略保证硬盘坏了,数据不丢.而本地磁盘坏了,会导致数据丢失,故一般操作系统放在本地磁盘.而数据放在存储盘. 存储里依然有:cpu( ...
- 查看ceph集群被哪些客户端连接
前言 我们在使用集群的时候,一般来说比较关注的是后台的集群的状态,但是在做一些更人性化的管理功能的时候,就需要考虑到更多的细节 本篇就是其中的一个点,查询ceph被哪些客户端连接了 实践 从接口上来说 ...
- xdebug不显示
- 记php多张图片 合并生成竖列 纵向长图(可用于商品详情图合并下载)
<?php namespace app\mapi\common\image; /** * 拼接多幅图片成为一张图片 * * 参数说明:原图片为文件路径数组,目的图片如果留空,则不保存结果 * * ...