类实例化次数计数
# 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%行的写法。