如何使用“普通”(关键词)参数或父类实例来初始化继承的对象

2024-06-01 00:02:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. 通过传递通常传递给timedelta的(关键字)参数,例如TimeDelta(seconds=5)
  2. 通过将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

似乎立即调用了else语句,但这不起作用,因为timedelta不希望自身的实例在其实例化中作为参数。是这样吗?如果是这样,为什么没有触发if语句?你知道吗


Tags: 实例方法self参数datetimeifdefarg
1条回答
网友
1楼 · 发布于 2024-06-01 00:02:08

Python根本不会进入你的__init__。timedelta类定义了__new__,正如您在the source code中看到的那样,错误发生在那里-这就是为什么您在回溯中看不到代码的原因。你知道吗

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

相关问题 更多 >