系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[实例:用类方法计数]

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


文章《系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[实例:用静态方法计数]》中使用了静态方法对类生成的对象计数,实际上,类方法也可以实现类似的效果一一一如下代码与前面列出的静态方法版本具有相同的行为,但是它使用一个类方法来把实例的类接收到其第一位参数中。类方法使用通用的自动传人类对象.而不是硬编码类名称::

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

这个类与前面的版本使用方式相同,但是通过类和实例调用printNumInstances方法的时候,它接受的是spam类而不是实例:

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

输出:

3
3

不过当使用类方法的时候,别忘了它们接收调用的主体的最具体(最底层)的类。当试图通过传入类来更新类数据的时候,这具有某些细微的隐藏含义。例如,如果我们在模块中像前文那样通过子类化定制、扩展Spam.printNumInstances以同时显示其cls参数,并且开始一个新的测试会话:

class Sub(Spam):def printNumInstances(cls):print('SubSpam')Spam.printNumInstances()printNumInstances = classmethod(printNumInstances)class Other(Spam):pass

输出:

SubSpam
2
SubSpam
2
2

每当一个类方法运行的时候,最底层的类都会被传人,即便对于没有定义该方法自己版本的子类:

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

输出:

SubSpam
2
SubSpam
2
2

这里的第一个调用,通过Sub子类的一个实例进行了一次类方法的调用,并且Python传人了最底层的类Sub给该类方法。在这个例子中,由于该方法的Sub重定义版本显式地调用了Spam父类的版本,Spam中的父类方法在第一位参数中接收自己。但是,对于直接继承类方法的一个对象,看看发生了什么:

c = Other()
c.printNumInstances()

输出:

3

这里的最后一个调用把Other传递给了Spam的类方法。这在这个例子中也有效,因为它通过继承获取了在Spam中找到的计数器。如果该方法试图赋值传人的类的数据,那么它将更新Object,而不是Spam在这个特定的例子中,如果Spam通过直接编写自己的类名来更新其数据可能会更好,而不是依赖于传人的类参数。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB curve fitting toolbox没有怎么办?

版本:MATLAB R2023b 如果在安装MATLAB时仅仅选择了安装MATLAB,而并未选择其他选项,则在进入MATLAB后会发现顶部的APP栏中无法找到曲线拟合工具箱。 本人跟随MATLAB中的教程进行下载时,出现了如下报错: 最终解决方案&a…

【SVD生成视频+可本地部署】ComfyUI使用(二)——使用Stable Video Diffusion生成视频 (2023.11开源)

SVD官方主页 : Huggingface | | Stability.ai || 论文地址 huggingface在线运行demo : https://huggingface.co/spaces/multimodalart/stable-video-diffusion SVD开源代码:Github(含其他项目) || Huggingface 在Comfyui使用&…

【博士论文写作 笔记02】研究挑战、研究目标、研究方案和研究内容的区别?

文章目录 一、声明二、介绍三、示例(涉及的博士论文未争取作者同意之前暂不公布) 一、声明 未完部分后续会更新 二、介绍 在博士论文写作中研究挑战、研究目标、研究方案和研究内容需要做详尽的阐述,但是几个概念很容易混淆,我…

MIT_线性代数笔记:线性代数常用概念及术语总结

目录 1.系数矩阵2.高斯消元法3.置换矩阵 Permutation4.逆矩阵 Inverse 1.系数矩阵 线性代数的基本问题就是解 n 元一次方程组。例如:二元一次方程组 2 x − y 0 − x 2 y 3 \begin{align*} & 2x - y 0\\ & -x2y 3 \end{align*} ​2x−y0−x2y3​ 写成…

通过strings二进制文件分析工具排查 version ‘GLIBC_2.25‘ not found 报错

strings命令简介 strings命令用于打印文件中可打印字符串, 可以打印文本文件、可执行程序,库文件等。一般用于分析可执行程序和库文件。strings命令较为常用的功能有以下两种 查看系统的GLIBC版本和目标文件的依赖的GLIBC版本,当系统的GLIBC版本与目标文…

谷歌公布一个可以让 AI 进行自我判断输出内容正确性的模型训练框架 ASPIRE

谷歌开发了一款名为 ASPIRE 的训练框架,旨在增强人工智能(AI)模型的选择性预测能力。这款框架为模型引入了 “可信度” 机制,即模型会输出一系列答案,并为每个答案赋予一个正确概率评分。通过这种方式,ASPI…

经典面试题-死锁

目录 1.什么是死锁? 2.形成死锁的四个必要条件 3.死锁的三种情况 第一种情况: 举例: 举例: 第二种情况:两个线程 两把锁 举例: 第三种情况:N个线程 M把锁 哲学家进餐问题 1.什么是死锁&…

windows11部署linux程序

windows11部署 msys2在windows10系统的安装 https://blog.csdn.net/engineer520/article/details/82192776 MSYS2使用记录——win10系统64位安装msys2最新版(msys2-x86_64-20190524.exe) _ https://www.cnblogs.com/world-explorer/p/16319426.html C语言…

Unity Asset store下载资源修改位置

Unity Asset Store的资源会随着项目的增长和资源的积累而越来越多。 在本文中,我们将修改Unity Asset Store的默认下载路径。 一、 默认保存路径的问题 当安装unity后,从Unity Asset Store下载资源时,它们通常会被存放在以下默认路径&#…

ThreadLocal使用

在用户每一次发起请求都会在tomcat服务器请求一个新的线程,我们在生成JWT token的时候将登录的用户信息注入到threadlocal中,那么这个线程进行其他请求都会携带着用户信息,我们可以在其他功能中得到当前的登录的用户信息,比如得到…

vue3中使用 vue3-slide-verify 滑块验证登录

在日常项目中我们实现登录的时候&#xff0c;会进行人为操作验证&#xff0c;这里使用滑块验证&#xff0c;常见的验证方式 我们借助插件 vue3-slide-verify 安装 npm install --save vue3-slide-verify 使用 在页面创建组件verification.vue 名字随意写入下面代码 <…

Linux破解密码

破解root密码&#xff08;Linux 7&#xff09; 1、先重启——e 2、Linux 16这一行 末尾加rd.break&#xff08;不要回车&#xff09;中断加载内核 3、再ctrlx启动&#xff0c;进入救援模式 4、mount -o remount&#xff0c;rw /sysroot/——&#xff08;mount挂载 o——opti…

大二下 课程安排

专业选修 web前端开发 信息与网络安全 必修 数据库原理 4 概率论与数理统计 4 软件设计与体系结构 3 编译技术 3 软件设计实践 2 大学体育 1 选修 &#xff08;待更新&#xff09; 目标 大二下一定要好好学习&#xff0c;不然最后总的排名真的就垫底了&#xff0c;大一上…

选择海外云手机需要考虑什么?

随着跨境电商行业的蓬勃发展&#xff0c;企业们纷纷寻找提升平台流量和广告投放效果的方法&#xff0c;这已成为业界的当务之急。传统的宣传模式在国内受到直播和链接带货等新兴方式的冲击&#xff0c;而在国外&#xff0c;类似的趋势也在悄然兴起&#xff0c;呈现出广阔的发展…

Halcon优化模板匹配速度

Halcon优化模板匹配速度 文章目录 Halcon优化模板匹配速度1. 缩小搜索空间2. 使用图像下采样 优化匹配速度可以从两个方面入手&#xff1a;缩小搜索空间和使用图像下采样。本节将分别从这两个方面进行解释。 1. 缩小搜索空间 搜索空间指搜索的范围&#xff0c;它是一个广义的概…

服务器运维小技巧(二)——如何进行监控告警

服务器运维难度高的原因&#xff0c;很大程度是因为服务器一旦出现问题&#xff0c;生产环境的业务就会受到严重影响&#xff0c;极有可能带来难以承担的后果。因此这份工作要求工程师保持高要求的服务质量&#xff0c;能够快速响应问题&#xff0c;及时解决问题。 但是“及时…

google-webrtc 原理

Google WebRtc Android 使用详解(包括客户端和服务端代码) - 知乎 (zhihu.com) 【记】Android使用WebRTC未释放资源导致的内存泄露 - 掘金 (juejin.cn)

Eureka-第一篇

​ 一、Eureka的概述 Eureka的基本概念和作用 Eureka是一个基于REST的服务&#xff0c;主要用于定位运行在AWS域中的中间层服务&#xff0c;以达到负载均衡和中间层服务故障转移的目的。Eureka是Netflix开发的服务发现框架&#xff0c;主要用于解决在云计算环境中动态位置服…

[docker] Docker镜像的创建以及Dockerfile的使用

一、Dokcer镜像的创建 创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。 1.1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web centos:7 /bin/bash …

C语言应用层程序热补丁

一、热补丁简介 一个正在运行的程序&#xff0c;要是有某函数或某流程有问题&#xff0c;需要修改&#xff0c;有两个方式&#xff1a; 1.通过设置LD_PRELOAD把需要的库重新定向&#xff0c;但这种方式需要重启正在运行的程序。 2.通过修改可执行文件某个函数指向的地址&…