дочитываю книгу М. Лутца “Изучаем Python” и пришла в голову идея создать декоратор класса, который подсчитывает кол-во созданных экземпляров.
Реализовать задачу полностью не удалось, вот что получилось:
def count(aClass): aClass.numInstances = 0 class Wrapper(aClass): def __init__(self, *args, **kargs): aClass.numInstances += 1 aClass.__init__(self, *args, **kargs) return Wrapper if __name__ == '__main__': @count class Spam(): def __init__(self): print('in Super.method') def printerS(self): print('blablabla') @count class Sub(Spam): pass @count class Other(Spam): def printer(self): print('lalala') x = Spam() y1, y2 = Sub(), Sub() z1, z2, z3 = Other(), Other(), Other() print(x.numInstances, y1.numInstances, z1.numInstances) print(Spam.numInstances, Sub.numInstances, Other.numInstances)
Output дает:
in Super.method
in Super.method
in Super.method
in Super.method
in Super.method
in Super.method
6 2 3
6 2 3
Счетчик класса Spam подсчитывает не только экземпляры класса Spam, но и экземпляры классов, которые наследут класс Spam.
Как можно исправить код, что бы счетчик считал корректно экземпляры, то есть что бы код проверки выводил в конце “1 2 3” вместо “6 2 3”?