覆盖 __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')
我正在尝试对 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')