在什么场景下要使用类方法

2023-10-26

静态方法和类方法的比较

静态方法

我们先来创建一个类,假设他是检测报告的相关信息。

class Report:
    inspection = "negative"

    def __init__(self, name, id_number):
        self.name = name
        self.id_number = id_number

那么这个类就很简单,他有检查结果,被检测者的名字和number等信息。那么此时我们想加一个方法,其实这个方法更类本身并无关系(也就是说这个函数可以),但是出于业务的需要,我们把这个方法写在该类里面更好的管理。

假设这个方法需要计算当前日期和输入日期的差值。

    @staticmethod
    def calculation_diff_time(history_time):
        history_time = datetime.strptime(history_time, "%Y-%m-%d %H:%M:%S")
        diff_seconds = (datetime.now() - history_time).seconds
        print(f"时间已过去{diff_seconds//60}小时")

我们来看一下这个方法的调用。

    Report("", "").calculation_diff_time("2022-05-01 09:00:00")
    print("不实例化")
    Report.calculation_diff_time("2022-05-01 09:00:00")
时间已过去754小时
不实例
时间已过去754小时

我们可以看到,静态方法无论实例不实例均可调用。并且因为没有实例函数的传递,静态方法不能调用类方法和实例方法。

总结来说,静态方法和对象本身并无关系,只是因为某种联系写在类里。类中应尽量规避过多的静态方法,因为这面向对象的思想有所违背。

但是依稀记得以前看过的一篇博客,提到静态方法同样是面对对象,面对的是类的本身,有利于多态。这里笔者水平有限,还是认为应该规避静态方法的使用,除非必要。

类方法

我们再来看一下类方法,我们在上述的静态方法上略作改变。

    @classmethod
    def reader_report(cls, history_time):
        history_time = datetime.strptime(history_time, "%Y-%m-%d %H:%M:%S")
        diff_seconds = (datetime.now() - history_time).seconds
        print(f"时间已过去{diff_seconds // 60}小时 结果{cls.inspection}")
    Report("", "").reader_report("2022-05-01 09:00:00")
    print("不实例化")
    Report.reader_report("2022-05-01 09:00:00")
时间已过去830小时 结果negative
不实例化
时间已过去830小时 结果negative

同样无论是否实例化,类方法均可调用,并且我们发现类方法可以调用类属性。我们再来试试实例属性和方法。

    @classmethod
    def reader_report(cls, history_time):
        history_time = datetime.strptime(history_time, "%Y-%m-%d %H:%M:%S")
        diff_seconds = (datetime.now() - history_time).seconds
        print(f"{cls.name}时间已过去{diff_seconds // 60}小时 结果{cls.inspection}")
Report("lisan", "").reader_report("2022-05-01 09:00:00")
AttributeError: type object 'Report' has no attribute 'name'

显然这里面的cls只是传递的类和并非对象,所以实例属性无法调用。我们再来试试方法是否可以调用。

    @classmethod
    def reader_report(cls, history_time):
        history_time = datetime.strptime(history_time, "%Y-%m-%d %H:%M:%S")
        diff_seconds = (datetime.now() - history_time).seconds
        print(f"时间已过去{diff_seconds // 60}小时 结果{cls.inspection}")
        cls.calculation_diff_time("2022-05-02 09:00:00")
        print("调用静态方法成功")
        cls.say_hello()
        print("方法调用成功")
时间已过去851小时
调用静态方法成功
    Report("lisan", "").reader_report("2022-05-01 09:00:00")
  File "E:/project_views/reader/ss.py", line 31, in reader_report
    cls.say_hello()
TypeError: say_hello() missing 1 required positional argument: 'self'

我们可以看到类方法只能调用静态方法,和无法调用其他方法。那么类方法在什么场景下更适合使用呢。

场景一

我们来看一下这个方法的名字,类方法。那么使用场景无疑很简单了。

    @classmethod
    def a_new_init(cls, name, id_number):
        return cls(name, id_number)
    report = Report("lisan", "")
    print(report.name)
    print(id(report))
    report = report.a_new_init("liuliu", None)
    print(report.name)
    print(id(report))
lisan
2036243181296
liuliu
2036243181240

我们可以看到调用实例方法,可以返回一个新类,那么该方法的第一个用法就是构建类。

那么我们来做下总结。

用处一 类方法可以作为类中对象的创建来使用,在不改变构造函数的情况下。可以为对象的创建提供多个入口。艺达到具体的使用用途。

场景二

我们都知道python对象是多态属性,其实类也是有多态的,具体的表现如下

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在什么场景下要使用类方法 的相关文章

  • Python中Shift和Caps Lock的状态

    我正在使用 Python 2 5 编写 TkInter 应用程序 我需要找出大写锁定和 Shift 键的状态 true 或 false 我在整个网络上进行了搜索 但找不到解决方案 Tkinter 中的键盘事件可能很棘手 我建议您按顺序查看以
  • 如何融化数据框以获取范围内的所有日期?

    我有一个这样的数据集 import pandas as pd pd DataFrame col1 1 2 start date 1 3 2019 1 10 2019 end date 1 5 2019 1 12 2019 我想为开始日期和结
  • 整数 numpy 数组乘以浮点数

    我有一个包含整数值的 numpy 数组 如果我将整个矩阵乘以一个浮点数 结果是一个浮点矩阵 但如果我通过 for 循环逐列相乘 它只给出整数部分 import numpy as np A np array 1 2 3 4 5 6 7 8 9
  • 在 Pycharm 中使用 scikit-learn 未解析的属性引用“predict()”

    当使用 scikit learn 中的决策树分类器时 docs http scikit learn org stable modules tree html展示您将存储分类器的变量重新分配给其自身的输出 调用fit method clf t
  • scrapy中cookies的正确使用形式是什么

    我是个新手 我正在一个使用cookies的网络中使用scrapy 这对我来说是一个问题 因为我可以在没有cookies的网络上获取数据 但在有cookies的网络上获取数据对我来说很困难 我有这个代码结构 class mySpider Ba
  • 使用 Python 请求通过 POST 请求发送图像

    我目前正在尝试使用 Python 3 5 和 Requests 库来发送 POST 请求 此 POST 将发送一个图像文件 这是示例代码 import requests url https api address files files o
  • python中的多服务器监控/自动重启

    我有 2 个服务器程序 必须使用 GNU Screen 启动 我想使用基于 Python 的程序来强化这些服务器 防止崩溃 该程序启动每个屏幕会话 然后监视服务器进程 如果服务器进程崩溃 我需要 python 代码来终止无关的屏幕会话并再次
  • Python select() 行为很奇怪

    我在理解 select select 的行为时遇到一些困难 请考虑以下 Python 程序 def str to hex s def dig n if n gt 9 return chr 65 10 n else return chr 48
  • 将行转换为 pandas 中逗号分隔的字符串

    我有一个熊猫数据框 from pandas import DataFrame import pandas as pd df2 DataFrame a one one two two three two one six b x y z y x
  • 在 Python 中使用带有 asyncio 的信号量

    我试图限制使用信号量同时运行的异步函数的数量 但我无法让它工作 我的代码归结为 import asyncio async def send i print f starting i await asyncio sleep 4 print f
  • 我可以在 Mac OS X 上将 enthought python 重新链接到新版本的 openssl 吗?

    今天早上 我在 Mac OS X 10 6 8 上使用 EPD 7 3 时遇到了与 SSL 相关的问题 当我运行 pip 版本 1 3 1 时 我得到 pip install requests Downloading unpacking r
  • Python 中定义了黄金比例吗?

    有没有办法得到黄金比例phi 在标准Python模块中 我知道e and pi in the math模块 但我可能错过了phi某处定义 scipy constants http docs scipy org doc scipy refer
  • Scipy - 求矩阵列空间的基数

    我正在尝试编写一个简单的单纯形算法 其第一步是找到一个基本的可行解决方案 选择 A 的线性独立列的一组 B 将 x 中与不在 B 中的列相对应的所有分量设置为零 求解 m 个所得方程以确定 x 的分量 这些是基本变量 我知道解决方案将涉及使
  • 如何计算 pandas 系列中到前一个零的距离?

    我有以下 pandas 系列 以列表形式表示 7 2 0 3 4 2 5 0 3 4 我想定义一个新的系列 返回到最后一个零的距离 这意味着我想要以下输出 1 2 0 1 2 3 4 0 1 2 如何以最有效的方式在 pandas 中做到这
  • python pandas 将两行或多行文本合并为一行

    我有包含文本数据的数据框 如下所示 name address number 1 Bob bob No 56 2 gmail com 3 Carly email protected cdn cgi l email protection No
  • TensorFlow 的 Print 或 K.print_tensor 不会在损失函数中打印中间张量

    我为 Keras 模型编写了一个相当复杂的损失函数 并且它不断返回nan训练时 因此 我需要在训练时打印中间张量 我知道你不能在损失函数中执行 K eval 因为张量未初始化 不过 我都尝试过K print tensor and tf Pr
  • PyPy/RPython 可以用来生成小型独立可执行文件吗?

    或者 可以使用 PyPy RPython 将 Python 编译 翻译为 C C 不需要 Python 运行时 我试图通过它的 RPython 和 Python 它的运行 它的编译和它的翻译来理解 PyPy 但有些失败 I have a h
  • django 返回记录的最近日期

    我正在尝试从用户的多个记录中返回最近的日期 当用户创建文档时 创建日期存储在 CreatedDocumentDetails 模型中 我无法返回用户最近创建的文档的日期 我问这个关于SO的问题 https stackoverflow com
  • Python 子进程在发出 HTTP 请求时无提示崩溃

    我在组合多处理 请求 或 urllib2 和 nltk 时遇到问题 这是一个非常简单的代码 gt gt gt from multiprocessing import Process gt gt gt import requests gt g
  • 如何使用 python 绘制具有两个斜率的线

    我使用下面的代码绘制一条具有两个斜率的线 如图所示 斜率应该在一定限制 limit 5 之后下降 我正在使用矢量化方法来设置斜率值 还有其他方法来设置斜率值 有人可以帮助我吗 import matplotlib pyplot as plt

随机推荐

  • 查找算法--二分查找 c++实现

    二分查找也称折半查找 Binary Search 它是一种效率较高的查找方法 但是 折半查找要求线性表必须采用顺序存储结构 而且表中元素按关键字有序排列 vs2017 include
  • Docker学习--Docker仓库之Docker Hub的简单了解

    Docker之所以能这么快的火起来 和Docker Hub的作用是分不开的 Docker构建了像GitHub一样的仓库 用来存放大家构建好的Docker镜像 其中已经包括了15000的镜像 大部分需求 都可以通过在Docker Hub中直接
  • npm不是以管理身份运行遇到的问题

    环境 win10 npm3 10 5 问题 在npm install lodash时 出现下列错误 npm debug log 文件内容 0 info it worked if it ends with ok1 verbose cli C
  • 性能测试相关术语

    性能测试相关术语 一 负载 模拟业务操作对服务器造成压力的过程 比如模拟100个用户发帖 二 性能测试 Performance Testing 模拟用户负载来测试系统在负载情况下 系统的响应时间 吞吐量等指标是否满足性能要求 三 负载测试
  • Makefile = 、:=、?=的区别

    相当于 c 语言中的 预编译的过程 在真正解释Makefile前会先将对应的 号左边的量替换成右边的量 而 则是跟 宏观的 号相似 是简单赋值的运算符号 下面举个例子就可以清楚的知道它们之间有何不同 cross arm linux cc c
  • 开关电源怎么测试文波_为什么开关电源需要测试动态响应

    1 导读概念动态响应一般是指控制系统在典型输入信号的作用下 其输出量从初始状态到最终状态的响应 对某一环节 系统 加入单位阶跃输入x t 时 其响应y t 开始逐渐上升 直到稳定在某一定值上为止 响应y t 在达到一定值之前的变化状态称为过
  • 直播分发选低延迟 RTC 还是 CDN?

    简单来看 一个完整的直播应用实现原理是 主播端采集音视频 推到服务器 再由服务器分发给观众观看 主播端负责推流 需要配置选用 RTC 链路分发直播画面或者用 CDN 链路分发 如果涉及连麦还需要考虑如何做 MCU 合流 观众订阅合流的好处是
  • python 读取配置文件config_python学习-读写配置文件-ConfigParse用法

    一 读取配置文件 config ini read filname 读取文件内容 section 获取所有section 返回list options section 获取该section所有options 返回list items sect
  • IDEA + SSH OA 第一天(Hibernate : Mapping (RESOURCE) not found)

    切入主题 看看今天的错误是如何发生的 首先这是我的项目路径 java 是 Sources Root resources 是 Resources Root 放了所需要的配置文件 其中 Hibernate 的配置 显示的是绿色 说明没有问题 在
  • Java基础知识-Map

    1 Map体系 2 各实现类说明及区别 3 哈希映射技术 哈希映射技术是一种就元素映射到数组的非常简单的技术 由于哈希映射采用的是数组结果 那么必然存在一中用于确定任意键访问数组的索引机制 该机制能够提供一个小于数组大小的整数 我们将该机制
  • Windows和Ubuntu下Firefox账号不能同步的解决办法

    最近开始用Ubuntu系统发现一个问题 我在Ubuntu系统自带的或者软件中心下的Firefox版本下创建一个账号 再在Windows的Firefox下登录发现此账号不存在 原因是Firefox有个全球服务和本地服务 Ubuntu下的Fir
  • vscode c++安装与单文件多文件编译配置(win10)

    vscode c 安装与单文件多文件编译配置 win10 总体思路 1下载Vscode mingw cmake 用于多文件编译 2配置 1 gt mingw vscode cmake环境变量 2 gt vscode 插件Chinese co
  • Redis多线程与ACL

    Redis是单线程吗 Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的 这也是 Redis 对外提供键值存储服务的主要流程 但 Redis 的其他功能 比如持久化 异步删除 集群数据同步等 其实是由额
  • JS中正则表达式常用语法总结

    目录 一 正则表达式的创建 二 的区别 三 和 四 d s w 五 六 test match 七 支持正则表达式的 String 对象的方法 一 正则表达式的创建 JS正则的创建有两种方式 new RegExp 和 直接字面量 使用RegE
  • Java Remote Debug(IDEA实现远程调试)

    前言 介绍 Java Remote Debug指的是 Java远程调试 特别是当你在本地开发的时候 你需要调试服务器上的程序时 远程调试就显得非常有用 本人就遇到这样一个问题 本地环境运行一切正常 但是部署到服务器就报错 而且问题一直找不到
  • ctfshow中web入门题关键解题思路

    一 信息搜集 1 web1 查看页面源代码 2 web2 burdsuite抓包 3 web3 burdsuite抓包 4 web4 查看robots txt文件 5 web5 查看index phps文件 6 web6 一般网站开发的源代
  • 开源IaaS云平台的分析与比较

    http blog csdn net jiayuboxin article details 11934223 http blog csdn net jiayuboxin article details 10977429 Project Sa
  • Dirichlet分布的推导与理解

    1 概述 Dirichlet 分布与贝塔分布 伽马分布有着紧密的联系 在贝叶斯统计中经常被用作其它概率分布如多项分布的先验分布 且在LDA分析中得到了广泛应用 本文结合直观理解以及详细的数学推导得到狄利克雷分布具体形式 并结合可视化以加深理
  • 解决Android Studio连接不上逍遥模拟器的问题

    1 打开逍遥模拟器 2 打开Android Studio 所要运行的项目 3 cmd 打开命令提示符 然后输入 adb connect 127 0 0 1 21503 然后回车 OK搞定 屡试不爽 看下图 其他模拟器参考这里点击打开链接
  • 在什么场景下要使用类方法

    静态方法和类方法的比较 静态方法 我们先来创建一个类 假设他是检测报告的相关信息 class Report inspection negative def init self name id number self name name se