继承__iadd__从日期开始,并返回新类的返回实例

时间:2015-06-05 19:04:39

标签: python oop

我有一些工作需要在每个月的最后一个星期五略有不同。所以我想添加一个方法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__,因为它可以为日期对象调用。

任何帮助,非常感谢。

2 个答案:

答案 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.")