Как продлить стрелку? (и похожие классы в модулях)

Я пытаюсь продлить 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 уровня модуля; с более простыми модулями вы могли бы просто создавать подклассы их классов напрямую.

Другие вопросы по тегам