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时调用它。