系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[静态方法备选方案]

本文主要是介绍系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[静态方法备选方案],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分类目录:《系统学习Python》总目录


除了将一个无self方法进行特殊标记以外,我们有时还可以用一些不同的编码结构来达到类似的结果。例如,如果我们只想要调用一个不通过实例而访问类成员的函数,可能最简单的思路就是在类之外编写一个普通函数,而不是编写类方法。通过这种方式,调用中不会期待一个实例。例如,对文件的如下修改在Python3.X和Python2.X中都有效:

class Spam:numInstances = 0def __init__(self):Spam.numInstances  = Spam.numInstances + 1def printNumInstances():print(Spam.numInstances)

输入:

a = Spam()
b = Spam()
c = Spam()printNumInstances()

输出:

3

因为类名称对简单函数而言是可读取的全局变量,这种方式可正常工作。此外,也要注意到函数名变成了全局变量,不过只针对这个模块而言;它不会和程序其他文件中的变量名冲突。

在Python中的静态方法之前,这一结构是通用的解决方案。由于Python已经把模块提供为命名空间划分工具,因此除非一个函数实现了对象的行为,否则我们总是可以认为不必把函数打包进类中。像这里这样的模块中的简单函数,实现了无实例类方法的大多数工作,并且已经与类关联起来,因为它们位于同一模块中。

遗憾的是,这种方法仍然不是理想的。其一,它给该文件的作用域添加了一个额外的名称,该名称唯一作用只是用来处理单个的类。其二,该数在代码结构上与类的联系很小;实际上,它的定义可能写在数百行代码之外的位置。可能更糟糕的是,由于它们位于类的命名空间之外的原因,像这样的简单函数不能通过继承定制,也就是说子类不能通过重新定义这样的一个函数来直接替代或扩展它。

我们也可以尝试像以往那样使用一个常规方法并总是通过一个实例调用它,从而使得这个例子以与Python版本无关的方式工作:

class Spam:numInstances = 0def __init__(self):Spam.numInstances  = Spam.numInstances + 1def printNumInstances(self):print(Spam.numInstances)

输入:

a = Spam()
b = Spam()
c = Spam()a.printNumInstances()
Spam.printNumInstances(a)
Spam().printNumInstances()

输出:

3
3
4

遗憾的是,如果我们没有一个实例可用就无法使用该方法,然而如果产生一个实例来使用该方法又会改变类的数据,就像这里的最后一行。更好的解决方案可能是在类中把一个方法标记为不需要一个实例。

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.

这篇关于系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[静态方法备选方案]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640864

相关文章

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包