Как продлить стрелку? (и похожие классы в модулях)
Я пытаюсь продлить arrow
и не понимаю, как я могу воспроизвести функциональность базовых классов. Вероятно, это связано с отсутствием четкого понимания того, как расширять классы в модулях (подчеркнуто моим arrow
случай - это означает, что вопрос, вероятно, является более общим, чем ограничивается arrow
только).
arrow
основное использование:
>>> import arrow
>>> arrow.now()
<Arrow [2016-11-19T15:13:23.897484+01:00]>
>>> arrow.get("2016-11-20")
<Arrow [2016-11-20T00:00:00+00:00]>
Я хотел бы добавить when
метод, который вернет "сегодня", "завтра" или "позже". Я впервые попробовал это:
import arrow
class MyArrow(arrow.Arrow):
def __init__(self, *args):
arrow.Arrow.__init__(self, *args)
def when(self):
now = arrow.now()
end_today = now.ceil('day')
end_tomorrow = now.replace(days=+1).ceil('day')
start_tomorrow = now.replace(days=+1).floor('day')
if self < end_today:
return 'today'
elif self < end_tomorrow:
return 'tomorrow'
else:
return 'later'
if __name__ == "__main__":
tom = MyArrow.now().replace(days=+1)
print(tom.when())
someday = MyArrow.get("2016-11-19")
Результат
tomorrow
Traceback (most recent call last):
File "D:/Dropbox/dev/domotique/testing/myarrow.py", line 23, in <module>
someday = MyArrow.get("2016-11-19")
AttributeError: type object 'MyArrow' has no attribute 'get'
Так что первая часть работала, но get()
не удалось. Я посмотрел на источники и get
в ArrowFactory
, Если я продлил ArrowFactory
вместо Arrow
Я смогу использовать get
но нет now()
больше.
Это тот момент, когда я в растерянности: приведенное выше "базовое использование" показывает, что я могу позвонить arrow.whatever_is_available
независимо от того, определено ли оно в классе Arrow
или же ArrowFactory
,
Как это работает?
Как я могу добавить свой when
способ сохранить остаток arrow
как оно есть (и все его методы)?
1 ответ
- Расширяемый для ваших собственных типов, полученных из Arrow
является одной из выделенных функций в документации Arrow, которая на самом деле демонстрирует , как именно создавать и использовать пользовательские Arrow
подкласс:
Фабрики
Используйте фабрики для использования API модуля Arrow для пользовательского типа, производного от Arrow. Во-первых, выведите свой тип:
>>> class CustomArrow(arrow.Arrow): ... ... def days_till_xmas(self): ... ... xmas = arrow.Arrow(self.year, 12, 25) ... ... if self > xmas: ... xmas = xmas.replace(years=1) ... ... return (xmas - self).days
Тогда получите и используйте фабрику для этого:
>>> factory = arrow.Factory(CustomArrow) >>> custom = factory.utcnow() >>> custom >>> <CustomArrow [2013-05-27T23:35:35.533160+00:00]> >>> custom.days_till_xmas() >>> 211
Вы можете позвонить .get
, .now
а также .utcnow
методы на factory
и получить свой собственный подкласс, с его .when
метод.
Это специфично для работы с Arrow и его API уровня модуля; с более простыми модулями вы могли бы просто создавать подклассы их классов напрямую.