Это чувство как будто вы должны были сделать что-то еще это потому что hours
, minutes
, seconds
являются свойствами .
Вы не делаетедействительно нужно, чтобы эти значения хранились как атрибуты вашего объекта, вы просто хотите иметь доступ к этим значениям, когда вам нужно.
Вызов чего-то вроде:
>>> t1.hours
5
Итак, давайте перепишем ваш примериспользуя property
:
class MyTime:
def __init__(self, hrs=0, mins=0, secs=0):
self.totalsecs = hrs*3600 + mins*60 + secs
@property
def hours(self):
return self.totalsecs // 3600
@property
def minutes(self):
return self._get_leftoversecs() // 60
@property
def seconds(self):
return self._get_leftoversecs() % 60
def _get_leftoversecs(self):
return self.totalsecs % 3600
def increment(self, t):
self.totalsecs += t
Пример использования:
>>> t1 = MyTime(5,5,5)
>>> t1.hours
5
>>> t1.hours()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> t1.seconds
5
>>> t1.totalsecs
18305
>>> t1.increment(10)
>>> t1.seconds
15
>>> t1.totalsecs
18315
Не знаю, заметили ли вы, но вам на самом деле не нужноincrement
функция больше :
>>> t1.totalsecs += 10
>>> t1.totalsecs
18325
Я знаю, что property
должно быть немного впереди того, что вы делаете, но я подумал, что это стоило бы примера.
Редактировать: Как Lattyware заметил, что нет необходимости делать totalsecs
свойство тоже.
Цитирую его комментарий: Самое замечательное в свойствах Python - вам не нужно превращать все в методы получения и установки, чтобы поддерживать согласованный интерфейс, как в некоторых языках.
Может быть преимуществом установка totalsecs
в качестве свойства (только для чтения), только если по какой-то причине вы хотите скрыть внутреннюю реализацию MyTime
(очевидно, реинтеграцию метода increment()
).