我有一些工作需要在每个月的最后一个星期五略有不同。所以我想添加一个方法IsLastFriday到日期,如果查看的日期是该月的最后一个星期五,则返回True
。所以我编写了自己的继承日期的类,并添加了逻辑。
from datetime import date
from datetime import timedelta
class my_date(date):
def __init__(self, y, m ,d):
super(my_date, self).__init__(y, m, d)
def IsLastFriday(self):
days = [0 31 28 31 30 31 30 31 31 30 31 30 31]
month = self.month
total_days = days[month]
if total_days - self.day <= 6 and self.isoweekday == 5:
return True
else:
return False
def __iadd__(self, other):
n_date = self.__add__(other)
n_my_date = my_date(n_date.year, n_date.month, n_date.day)
return n_my_date
一切正常。我觉得应该有一种更优雅/更有效的方式来实现__iadd__
,而不是每次都构建一个新对象。
当我试着打电话时
super(my_date, self).__iadd__(other)
我收到错误,因为'super' object has no attribute '__iadd__'
,如果我尝试拨打__add__
,我会收到日期回复的实例。
我觉得我应该能够以某种方式继承__iadd__
,因为它可以为日期对象调用。
任何帮助,非常感谢。
答案 0 :(得分:0)
我觉得我应该能够以某种方式继承
__iadd__
,因为它可以为日期对象调用。
不是。 date
个对象没有__iadd__
;当您尝试对它们使用+=
时,Python会查找__iadd__
,发现它不存在,并使用__add__
代替date
。由于__iadd__
对象是不可变的,因此无法以改变的方式实现__iadd__
,因此您实际上根本不应该实现__add__
;你应该实施{{1}}。
答案 1 :(得分:0)
如果您只想添加一些在datetime
实例上运行的逻辑,则不能使用子类化内置类型。一个简单的函数就可以了:
import datetime
def is_last_friday_of_month(dt):
"""Determine whether `dt` is the last Friday of the month."""
if dt.weekday() != 4: # Friday is 4
return False
dt_week_after = dt + datetime.timedelta(weeks=1)
return dt.month != dt_week_after.month
像这样使用:
now = datetime.datetime.now()
if is_last_friday_of_month(dt):
print("It's the last Friday of the month.")