第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对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享 ...
随机推荐
- 快速傅里叶变换(FFT)学习笔记(其二)(NTT)
再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 写在前面 一些约定 前置知识 同余类和剩余系 欧拉定理 阶 原根 求原根 NTT ...
- MySQL中load data infile将文件中的数据批量导入数据库
有时候我们需要将文件中的数据直接导入到数据库中,那么我们就可以使用load data infile,下面具体介绍使用方法. dao中的方法 @Autowired private JdbcTemplat ...
- C# 时间格式处理
C#的常用时间格式意义: 1字符"y"---year,年,yy显示13,yyyy显示2013 2字符"M"---Month,月份,M显示5,MM显示05 3字符 ...
- 易于理解的 python 深度学习摘要算法教程
序 "我不想要一份完整的报告,只要给我一份结果摘要就好".我经常发现自己处于这种状况 -- 无论是在大学里还是在我的职业生涯中.我们准备一份全面的报告,但老师/主管却只有时间阅读摘 ...
- .NET EF实现NoLock
sql实现方法: select * from 表名(nolock) 加上(nolock) EF实现办法: 程序集引用 System.Transactions ...
- 高清DEM最高立减1500元!
选购攻略: 活动一:选购12.5米DEM(地形)数据.30米 DEM(地形)数据,满500元立减100元.满1000元立减200元.满2000立减500元.满5000元立减1500元:每位用户仅可享受 ...
- 面试官:Redis 主从复制时网络开小差了怎么整?
上周因为实在太忙就认认真真写了一篇水文,吹了一下自己过去的经历,反响竟然超出了我的预期,并且后台还有读者留言表示想看续集的.哈哈,果然大家还是对水文更有热情. 这期我们继续回到之前的 Redis 话题 ...
- 【java从入门到精通】day-07-逻辑运算符-位运算符-条件运算符-扩展赋值运算符
逻辑与(&&).或(||).非(!) 示例: package operator;public class Demo05 { public static void main(St ...
- ubuntu配置bonding
如果节点上有多个网络接口时可以通过bonding将多个网络接口虚拟为一个网络接口,bonding可以提供高可用及负载均衡功能,从而提高节点的网络接口性能及可用性. 配置单bond 一.使用如下命令安装 ...
- webug第十四关:存储型XSS
第十四关:存储型XSS 打开发现是评论区 留言加入xss语句