覆盖__add__,异常没有被捕获尝试super().__ add__

时间:2018-01-26 08:59:57

标签: python inheritance add timedelta

我正在尝试将pandas'ERR_CONNECTION_CLOSED子类化,所以当它被整数/浮点数求和时,我们认为它是一个带有秒的Timedelta

我尝试了以下内容:

Timedelta

但出于某种原因,我无法进入class Timedelta(pd.Timedelta): def __add__(self, other): print("OVERRIDEN ADD") try: print("SUPER ADD") return super().__add__(other) except: print("NEW ADD") return super().__add__(Timedelta(str(other)+"s")) 实施:

"NEW ADD"

我期待抓住这个>>> a = Timedelta2('10s') >>> a+1 OVERRIDEN ADD Traceback (most recent call last): File "C:\Python36\lib\site-packages\IPython\core\interactiveshell.py", line 2910, in run_code SUPER ADD exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-51-98b939904c8e>", line 1, in <module> a+1 TypeError: unsupported operand type(s) for +: 'Timedelta2' and 'int' 异常,但由于某种原因它不是,所以我想请求一些帮助来弄清楚这里会发生什么。

谢谢!

2 个答案:

答案 0 :(得分:4)

super().__add__(other)不会引发异常!它返回NotImplemented。这就是你如何表示你的操作符过载不理解它所获得的参数的方式。一旦双方都表示他们无法执行操作,TypeError来自操作员机器。

不要试图捕捉到那里没有来自的异常,而是检查super().__add__(other)是否返回NotImplemented

答案 1 :(得分:1)

您并不理解__add__方法!尝试下面的方式来得到你的期望! try ... expect效率不高,因此您应该使用if .. else

import pandas as pd

class MyTimedelta(pd.Timedelta):
    def __add__(self, other):
        print("OVERRIDEN ADD")
        if isinstance(other, int):
            return pd.Timedelta("{}s".format(int(self.seconds)+ other))
        else:    
            super(MyTimedelta, self).__add__(other)

然后您可以执行以下操作:

In [22]: s=MyTimedelta('2s')

In [23]: s+3
OVERRIDEN ADD
Out[23]: Timedelta('0 days 00:00:05')