Требуется написать класс, который считает количество созданных им инстансов.
Метод класса get_created_instances_count()
должен возвращать это число.
код должен пройти эту проверку:
class CreatedInstancesCounter(object): # писать решение сюда # pass if TEST: for i in xrange(56): CreatedInstancesCounter() assert CreatedInstancesCounter.get_created_instances_count() == 56 CreatedInstancesCounter() assert CreatedInstancesCounter.get_created_instances_count() == 57 print 'Task 2 OK'
У меня не хватает репутации на комментарий, но очень хочется тоже справиться с этой задачей, поэтому пишу вопрос в ответ. Я делаю так:
class CreatedInstancesCounter(object): i = 0 def __init__(self): self.i += 1 @staticmethod def get_created_instances_count(): return i
и у меня i
после цикла в тесте равно 55, а не 56 (каким бы не было начальное значение i
). Проблема в том, что я увеличиваю i
через self? Других способов достучаться до переменной, не делая init статическим методом я не нашел, а если инит статичен, то питон говорит что local variable 'i' referenced before assignment
. Подтолкните пожалуйста и меня в нужную сторону.
UPD: до меня дошло, поэтому делюсь ответом здесь же. Как в комментариях указал @Etki, метод get_created_instances_count возвращает глобальную переменную i
, а не переменную класса, как я думал. Рабочим решением будет следующее:
class CreatedInstancesCounter(object): c = 0 def __init__(self): self.__class__.c += 1 @classmethod def get_created_instances_count(cls): return cls.c
@classmethod позволяет принимать первым аргументом не экземпляр класса, а класс, таким образом к статической переменной класса можно обращаться путем cls.var_name, а не ClassName.var_name