Я пытаюсь расширить класс datetime.date
допускает добавление int
сек вместо того чтобы работать с timedelta
объектами:Подкласс супер возвращение самостоятельно должен возвращать подкласс
class Date(datetime.date):
def __add__(self, other):
if isinstance(other, int):
other = datetime.timedelta(days=other)
return super(Date, self).__add__(other)
Проблема заключается в том, что метод __add__()
выше будет возвращать экземпляр от datetime.date
вместо Date
.
От моего понимания, нет способа сделать super().__add__()
осведомленным о Date
типа. Самое элегантное решение - скопировать весь метод __add__()
с datetime.date
и добавить дополнительный бит кода. Есть ли способ сделать объект datetime.date
объекту Date
в методе Date.__add__()
?
Вот отрывок, чтобы выделить вопрос:
D = Date(2000,1,1)
d = D + 1
type(d) # datetime.date instead of Date
EDIT: Мой первый раствор после глядя на datetime.py (поиск "даты класса"), чтобы сделать это:
class Date(datetime.date):
def __add__(self, other):
if isinstance(other, int):
other = datetime.timedelta(days=other)
d = super(Date, self).__add__(other)
self.__year = d.year
self.__month = d.month
self.__day = d.day
return self # this is of type datetime.date
OK , Я подумал, что хотел бы указать, что моя первая попытка:
class Date(datetime.date):
def __add__(self, other):
if isinstance(other, int):
other = datetime.timedelta(days=other)
d = super(Date, self).__add__(other)
d.__class__ = Date
return d
, который не будет работать k, поскольку (как я подозревал) модуль datetime находится в C и в соответствии с this post для таких типов вы не можете назначить __class__
. Я немного смущен, что код в datetime.py для этого.
Что-то вроде 'return Date (super (Date, self) .__ add __ (other)'? – bimsapi
@bimsapi Не работает, к сожалению. Кажется, что конструктор 'datetime.date' не так хорош – matsjoyce
Конечно, методы 'super' возвращают' datetime.date', ** это суперкласс **! Однако вы можете создать 'Date' из него:' d = super (Date, self) .__ add __ (other) , return Date (d.year, d.month, d.day) '. – jonrsharpe