2014-12-22 1 views
0

Я пишу небольшой объект часов в Python, который можно запустить, остановить и сбросить. Мне трудно понять, как правильно отслеживать накопление времени. Прямо сейчас, как записывается процедура обновления, часы накапливают слишком много времени (из-за вызовов метода обновления). Я не уверен, как написать это так, чтобы она накапливала правильное время.Как правильно обращаться с аккумулятором в часах Python?

import time 
import datetime 

class Clock(object): 

    def __init__(
     self, 
     name = None, 
     start = True 
     ): 
     self._name = name 
     self._start = start # Boolean start clock on instantiation 
     # If a global clock list is detected, add a clock instance to it. 
     if "clocks" in globals(): 
      clocks.add(self) 
     self.reset() 
     if self._start: 
      self.start() 

    def start(self): 
     self._startTime = datetime.datetime.utcnow() 

    def stop(self): 
     self._startTime = None 

    # Update the clock accumulator. 
    def update(self): 
     self.accumulator += (
      datetime.datetime.utcnow() - self._startTime 
     ) 

    def reset(self): 
     self.accumulator = datetime.timedelta(0) 
     self._startTime = None 

    # If the clock has a start time, add the difference between now and the 
    # start time to the accumulator and return the accumulation. If the clock 
    # does not have a start time, return the accumulation. 
    def elapsed(self): 
     if self._startTime: 
      self.update() 
     return(self.accumulator) 

    def time(self): 
     return(self.elapsed().total_seconds()) 

clock = Clock() 
print clock.time() 
print "starting"; clock.start() 
for i in range(4): 
    time.sleep(3) 
    print clock.time() 
print "stopping"; clock.stop() 
for i in range(4): 
    time.sleep(3) 
    print clock.time() 
print "starting"; clock.start() 
for i in range(4): 
    time.sleep(3) 
    print clock.time() 
print "resetting"; clock.reset() 
print clock.time() 
+0

Каково ваше ожидаемое время выхода? С небольшим изменением я получаю его «0, 3, 6, 9, 12, 12, 12, 12, 12, 15, 18, 21, 24, 0'. Желательно? – sberry

+0

Почему вы добавляете время с начала, а не просто устанавливаете его с момента запуска? – Amber

+0

@Amber, вы правы, за исключением того, что написано 'start', если' update' просто устанавливал 'self.accumulator', а не добавлял к нему, то« start »по существу вызывал бы сброс. Очевидно, это можно было бы написать так, чтобы это было не так, но, поскольку оно стоит, оно нарушалось бы с этим изменением. – sberry

ответ

1

Если вы просто добавить вызов self.start() в конце update то я думаю, что он будет работать так, как вы намерены.

Причина вы видите проблему с текущего кода вы добавляете общее смещение от _startTime до now() каждый раз, когда вы обновляете, но вы хотите только разницу между now() и когда таймер начал по первому зову. При последующих вызовах вы хотите разницу между now() и предыдущим звонком до update.

+0

А, вот и все. Спасибо за вашу помощь. Следуя вашим комментариям, я добавил дополнительный атрибут данных времени для записи времени последнего вызова обновления. Таким образом, я не уничтожаю информацию о времени начала (которую я хочу распечатать). – d3pd