覆盖 __add__,尝试 super() 时未捕获到异常。__add__

Overriding __add__, exception not being caught trying super().__add__

我正在尝试对 pandas' Timedelta 进行子类化,因此当它被 integer/float 求和时,我们将其视为带秒的 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'

我原以为这个 TypeError 异常会被捕获,但由于某种原因它没有被捕获,所以我想寻求一些帮助来弄清楚这里可能发生了什么。

谢谢!

super().__add__(other) 不会引发异常!它returnsNotImplemented。这就是你如何表示你的运算符重载不理解它得到的参数。 TypeError来自于操作者机器一旦双方都说他们无法执行操作。

与其尝试捕获并非来自那里的异常,不如检查是否 super().__add__(other) returns NotImplemented.

你还没有真正理解__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')