Если вы не стремится к классам вам, может использовать функцию и злоупотребления с использованием изменяемых-типов-как-по-умолчанию, инициализаторами:
def counter(init=None, container=[0]):
container[0] -= 1
if init is not None: container[0] = init
return container[0]
x = counter(100)
print(x) # 100
print(counter()) # 99
print(counter()) # 98
print(counter()) # 97
# ...
вызов counter
с одним аргументом, чтобы установить/инициализировать счетчик. Поскольку инициализация на самом деле является первым вызовом функции, она вернет это число.
Звоните counter
без аргументов, чтобы получить «следующее значение».
(Очень похоже на то, что я предложил here)
В качестве альтернативы, для синтаксисом ближе к то, что вы имели в своем вопросе, используйте properties:
class Counter(object):
def __init__(self, init):
self.val = init
@property
def value(self):
val = self.val
self.val -= 1
return val
count = Counter(50)
print(count.value) # 50
print(count.value) # 49
print(count.value) # 48
print(count.value) # 47
#...
Здесь вы создаете объект Counter
count
, то каждый раз, когда вы вызываете count.value
, он возвращает текущее значение и готовится к будущему вызову, уменьшая его внутренний атрибут val
.
Снова при первом запросе атрибута value
он возвращает номер, с которого вы его инициализировали.
Если по какой-то причине вы хотите «заглянуть» на то, что будет следующим вызовом count.value
, без декремента, вы можете посмотреть на count.val
.
[ '__call__' ] (https://docs.python.org/2/reference/datamodel.html#object.__call__) вызывается, когда вы вызываете свой экземпляр как функция. т.е. после выполнения 'count()', 'count.value' будет 49. Возможно, вы ищете [' __getattribute__'] (https://docs.python.org/2/reference/datamodel.html#object.__getattribute__) – Matt
@Matt: Я пытался использовать __getattribute__, но все тот же. Вы можете мне помочь? Спасибо –
Вы хотите, чтобы count.value уменьшалось на 1 при каждом обращении? – Matt