我正在尝试将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'
异常,但由于某种原因它不是,所以我想请求一些帮助来弄清楚这里会发生什么。
谢谢!
答案 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')