В общем, если вам нужно сохранить состояние между одним вызовом функции и следующим, вам нужен либо объект (ваше решение), либо генератор. В некоторых случаях одно будет проще, чем другое, но в принципе нет ничего неправильного в том, как вы это сделали (хотя у вас, похоже, есть проблемы с реализацией).
Предложение Свена, itertools.count()
, является генератором. Его реализация выглядит примерно так:
def count():
i = 0
while True:
yield i
i += 1
Теперь, если вы хотите, чтобы он вызывался как функция, а не next(c)
, вы можете определить оболочку, которая сделает это так:
def count(c=itertools.count()):
return next(c)
Или неизбежная однострочная лямбда:
count = lambda c=itertools.count(): next(c)
Затем count()
возвращает следующее целое число каждый раз, когда вы его вызываете.
Конечно, если вы хотите иметь возможность создавать любое количество вызываемых функций, каждая со своим счетчиком, вы можете написать фабрику для этого:
def counter():
return lambda c=itertools.count(): next(c)
Тогда это:
c = counter()
print c() # 0
print c() # 1
# etc
Это все еще кажется мне проще, чем предмет, но ненамного. Если бы ваше состояние или логика были более сложными, инкапсуляция объекта могла бы победить.