类实例化次数计数
# coding=utf-8 from functools import wraps ########### 仅使用self import time class A(): def __init__(self): if not hasattr(self, 'count'): self.__class__.count = 0 self.__class__.count += 1 A() A() A() print (A.count) ################ 使用类名 class B(): count = 0 def __init__(self): B.count += 1 # 或者self.__class__.count += 1 B() B() print (B.count) ############### 使用类方法的第一个参数访问类属性 class C(): count = 0 def __init__(self): self._increase_count() @classmethod def _increase_count(cls): cls.count += 1 C() c = C() print (C.count) ########## 重写new方法,必须是新式类 class D(object): count = 0 def __new__(cls,*args,**kwargs): cls.count += 1 return super(D, cls).__new__(cls) D() d = D() print (D.count) ########### 装饰器 def deco(cls): cls.get_count = lambda: cls._count @wraps(cls) def _inner(*args,**kwargs): if not hasattr(cls,'_count'): cls._count = 0 cls._count += 1 return cls(*args,**kwargs) return _inner @deco class E(object): pass E() E() E() E() print (E.get_count())
1、这些写方法都可以,主要是count一定要使用类属性,如果设置为实例属性是无法达到统计目的。其中第四种D类重写new方法的,必须是新式类,如果是python2必须写继承自object,因为__new__()是在新式类中新出现的方法,如果不是新式类,实例化时候不会调用此方法,不调用此方法,当然就无法计数了。
2、访问类属性的三种方法:
self.__class__.count 在实例方法中访问类属性
类名.count 在任意方法中可以使用类名访问类属性,其中在staticmethod方法中,必须使用此种方法才能访问类属性。
cls.count 在classmethod方法中访问类属性
反对极端面向过程编程思维方式,喜欢面向对象和设计模式的解读,喜欢对比极端面向过程编程和oop编程消耗代码代码行数的区别和原因。致力于使用oop和36种设计模式写出最高可复用的框架级代码和使用最少的代码行数完成任务,致力于使用oop和设计模式来使部分代码减少90%行,使绝大部分py文件最低减少50%-80%行的写法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」