Python 如何使用';通常';(关键字)参数或父对象的实例

Python 如何使用';通常';(关键字)参数或父对象的实例,python,Python,我想用模运算扩展datetime的timedelta类。我还希望能够通过两种方式初始化生成的TimeDelta类: 通过传递通常传递给timedelta的(关键字)参数,例如timedelta(秒=5) 通过将timedelta的实例作为参数传递,在这种情况下,timedelta将“接管”该实例的属性 我尝试了以下方法: import datetime class TimeDelta(datetime.timedelta): """Extends datetime's timedelt

我想用模运算扩展
datetime
timedelta
类。我还希望能够通过两种方式初始化生成的
TimeDelta
类:

  • 通过传递通常传递给
    timedelta
    的(关键字)参数,例如
    timedelta(秒=5)
  • 通过将
    timedelta
    的实例作为参数传递,在这种情况下,
    timedelta
    将“接管”该实例的属性
  • 我尝试了以下方法:

    import datetime
    
    class TimeDelta(datetime.timedelta):
        """Extends datetime's timedelta class with a modulo operation."""
    
        def __init__(self, *args, **kwargs):
            timedeltas = [arg for arg in args if isinstance(arg, datetime.timedelta)]
            if timedeltas:
                self = timedeltas[0]
            else:
                super(TimeDelta, self).__init__(*args, **kwargs)
    
        def __mod__(self, other):
            return self.total_seconds() % other.total_seconds()
    
    但是,如果我尝试用第一种方法创建
    TimeDelta
    的实例,我会得到一个
    TypeError

    In [1]: execfile('interval.py')
    
    In [2]: time_delta = TimeDelta(datetime.timedelta(seconds=5))
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-2-a0e79564603f> in <module>()
    ----> 1 time_delta = TimeDelta(datetime.timedelta(seconds=5))
    
    TypeError: unsupported type for timedelta days component: datetime.timedelta
    
    [1]中的
    :execfile('interval.py')
    在[2]中:time_delta=TimeDelta(datetime.TimeDelta(秒=5))
    ---------------------------------------------------------------------------
    TypeError回溯(最近一次调用上次)
    在()
    ---->1 time_delta=TimeDelta(datetime.TimeDelta(秒=5))
    TypeError:timedelta days组件的类型不受支持:datetime.timedelta
    

    似乎正在立即调用
    else
    语句,但该语句不起作用,因为
    timedelta
    在实例化时不希望自身的实例作为参数。是这样吗?如果是这样,为什么
    If
    语句没有被触发?

    Python根本没有进入您的
    \uuuu init\uuuu
    中。timedelta类定义了
    \uuuuu new\uuuuuuu
    ,正如您在中所看到的,错误发生在那里-这就是为什么您在回溯中看不到代码的原因


    (还要注意的是,
    self=timedeltas[0]
    除了重新绑定本地名称之外,根本不做任何事情,因此即使你绕过了初始化问题,你的代码也不会工作。)

    Python根本不会进入你的
    \uuuuuu init\uuu
    。timedelta类定义了
    \uuuuu new\uuuuuuu
    ,正如您在中所看到的,错误发生在那里-这就是为什么您在回溯中看不到代码的原因


    (还要注意的是,
    self=timedeltas[0]
    除了重新绑定本地名称之外,根本不做任何事情,因此即使你绕过了init问题,你的代码也不会工作。)

    我不太明白这里是如何调用
    \uu new\uuu
    方法的。根据,它是通过“调用类”来调用的,但在本例中,我在
    \uuu init\uuu
    之前所做的一切都是从
    datetime.timedelta
    继承的。我已经做了一些没有
    \uuuuu init\uuuuu
    的例子,这些例子似乎是可以实例化的,没有错误,所以在我看来,错误与
    \uuuuu init\uuuuu
    的存在有关?当你实例化一个TimeDelta时调用它。我不太明白
    \uu new\uuuuu
    方法是如何在这里被调用的。根据,它是通过“调用类”来调用的,但在本例中,我在
    \uuu init\uuu
    之前所做的一切都是从
    datetime.timedelta
    继承的。我已经做了一些没有
    \uuuuu init\uuuuuu
    的例子,这些例子似乎是可以实例化的,没有错误,所以在我看来,错误与
    \uuuuu init\uuuuu
    的存在相关联??当你实例化一个TimeDelta时调用它。