from datetime import timedelta
class A:
def __abs__(self):
return -self
class B1(A):
def __neg__(self):
return 'neg from B1'
class B2(timedelta):
def __neg__(self):
return 'neg from B2'
print(abs(B1())) # neg from B1
print(abs(B2(-1))) # 1 day, 0:00:00
为什么第一次打印调用使用重写方法,但第二次打印调用不是?我不明白。第二种情况似乎也在python实现here中调用-self
。
答案 0 :(得分:2)
我确定我在这里遗漏了一些内容,但是B2
没有理由要拨打__neg__
。 timedelta
基类肯定不会使用它。
B1().__abs__()
使用-self
来触发self.__neg__()
来电,但B2
没有应用此类操作符。
请注意,此处不涉及datetime.py
Python implementation;该代码适用于因某些原因无法运行C implementation of the same:
static PyObject *
delta_abs(PyDateTime_Delta *self)
{
PyObject *result;
assert(GET_TD_MICROSECONDS(self) >= 0);
assert(GET_TD_SECONDS(self) >= 0);
if (GET_TD_DAYS(self) < 0)
result = delta_negative(self);
else
result = delta_positive(self);
return result;
}
其中delta_negative
是__neg__
挂钩的本机实现;代码从不考虑子类。