静态方法和类方法的比较

静态方法

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

class Report:inspection = "negative"def __init__(self, name, id_number):self.name = nameself.id_number = id_number

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

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

    @staticmethoddef calculation_diff_time(history_time):history_time = datetime.strptime(history_time, "%Y-%m-%d %H:%M:%S")diff_seconds = (datetime.now() - history_time).secondsprint(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小时

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

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

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

类方法

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

    @classmethoddef reader_report(cls, history_time):history_time = datetime.strptime(history_time, "%Y-%m-%d %H:%M:%S")diff_seconds = (datetime.now() - history_time).secondsprint(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

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

    @classmethoddef reader_report(cls, history_time):history_time = datetime.strptime(history_time, "%Y-%m-%d %H:%M:%S")diff_seconds = (datetime.now() - history_time).secondsprint(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只是传递的类和并非对象,所以实例属性无法调用。我们再来试试方法是否可以调用。

    @classmethoddef reader_report(cls, history_time):history_time = datetime.strptime(history_time, "%Y-%m-%d %H:%M:%S")diff_seconds = (datetime.now() - history_time).secondsprint(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_reportcls.say_hello()
TypeError: say_hello() missing 1 required positional argument: 'self'

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

场景一

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

    @classmethoddef 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对象是多态属性,其实类也是有多态的,具体的表现如下

在什么场景下要使用类方法相关推荐

  1. 海量小文件场景下训练加速优化之路

    作者:星辰算力平台 1. 背景 随着大数据.人工智能技术的蓬勃发展,人类对于算力资源的需求也迎来大幅度的增长.在腾讯内部,星辰算力平台以降本增效为目标,整合了公司的GPU训练卡资源,为算法工程师们提供 ...

  2. 低资源场景下知识抽取的综述与展望

    前言 今天偶尔发现一篇关于低资源场景下知识抽取的综述,感觉还不错,分享给大家. 从非结构化文本中提取结构信息的知识提取 (KE) 经常受到数据稀缺和新出现的不可见类型(即低资源场景)的困扰.截至目前, ...

  3. 内容理解、内容生成、内容推荐分发,在广告场景下的实践和探索(京东张政)

    内容理解.内容生成.内容推荐分发,在广告场景下的实践和探索(京东张政) 提示:广告也好,商品也罢,内容们,需要精准地推荐给用户,使其点击观看或者够买啥的,都需要走通一个重要流程:内容理解与推荐分发,更 ...

  4. 关于std::string 在 并发场景下 __grow_by_and_replace free was not allocated 的异常问题

    使用string时发现了一些坑. 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新. 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧. ...

  5. 高并发场景下数据库的常见问题及解决方案

    一.分库分表 (1)为什么要分库分表 随着系统访问量的增加,QPS越来越高,数据库磁盘容量不断增加,一般数据库服务器的QPS在800-1200的时候性能最佳,当超过2000的时候sql就会变得很慢并且 ...

  6. 优酷智能档在大型直播场景下的技术实践

    作者 | 阿里文娱高级技术专家 肖文良 本文为阿里文娱高级技术专家肖文良在[阿里文娱2019双11猫晚技术沙龙]中的演讲,主要内容为如何通过优酷智能档,降低用户卡顿尤其是双11直播场景下,提升用户观看 ...

  7. 小米发力AI场景下的“快应用”,投百亿资源扶持开发者

    近日,备受瞩目的2018 MIDC小米AIoT第二届开发者大会在京召开,雷军宣布AI+loT是小米的核心战略,小米将和合作伙伴一起打造AI+loT的美好明天.另外,大会还宣布了小米与宜家达成全球战略合 ...

  8. Redis解决websocket在分布式场景下session共享问题

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/weixin_45089791/article/ details/118028312 在显示项目中 ...

  9. 高并发场景下的限流策略

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 在高并发的场景下,我们的优化和保护系统的方式通常有:多级缓存.资源隔离.熔断降级.限流等等. 今 ...

最新文章

  1. linux uefo引导 win_基于UEFI和GPT模式下U盘安装windows8.1和Linux双启动教程
  2. 计算机联锁与全电子执行单元,计算机联锁全电子执行单元.doc
  3. Fun Chat 饭聊手机软件
  4. 操作系统读写者问题实验报告_基于S3C2410微处理器和操作系统实现光电测量仿真检测系统的设计...
  5. 初识Linux .bash_profile, .bash_logout, and .bashrc 文件
  6. javaScript第二天(2)
  7. redis修改端口号后还是占用6379_Redis分布式缓存分布式集群搭建
  8. 冲刺One之站立会议6 /2015-5-19
  9. poj 2728 Desert King 01分数规划
  10. linux如何入侵电脑,如何入侵Linux系统 -电脑资料
  11. VSCode解决中文乱码问题最详解
  12. 《听闻远方有你》简谱-刘均演唱
  13. 高斯公式(div:点乘)
  14. Pyramidal RoR for Image Classification
  15. matlab emd imf波形,emd分解后画出IMF的波形
  16. 人生进度条百分之20_1分钟get技能:缺了“进度条”,你注定和80%的失败者一样实现不了人生目标...
  17. ninja ripper新版教程
  18. 实测:一周不更新文章头条号指数会掉多少?
  19. IT职场人生:学外语
  20. 史上最全颜色在古代的叫法(快速搜索)

热门文章

  1. 在 Linux 和 FireWire 上创建自己的 RAC 集群
  2. 逍遥安卓多开器出现android,逍遥安卓模拟器使用常见问题
  3. oled显示器的字体显示
  4. 绿盟赛—鲲鹏计算平台软件移植
  5. 初探Turtlebot2
  6. 什么是国土空间规划的“双评价”?
  7. Unity3d入门选作作业(一)
  8. 新技术到底靠不靠谱?在中国用一下就知道了
  9. 十三、Cadence ic 617 CDB转OA
  10. 网易真题之暗黑字符串