Child 调用 parent 调用 child ... 或不
Child calls to parent which calls back to child ... or not
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
。
我确定我在这里遗漏了什么,但是没有理由 B2
调用__neg__
。 timedelta
基类肯定不会用到它。
B1().__abs__()
使用 -self
,这会触发 self.__neg__()
调用,但 B2
没有应用此类运算符。
请注意 datetime.py
Python implementation isn't involved here; that code is there for systems that cannot, for some reason, run the 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__
挂钩的本机实现;这里的代码从不考虑子类。
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
。
我确定我在这里遗漏了什么,但是没有理由 B2
调用__neg__
。 timedelta
基类肯定不会用到它。
B1().__abs__()
使用 -self
,这会触发 self.__neg__()
调用,但 B2
没有应用此类运算符。
请注意 datetime.py
Python implementation isn't involved here; that code is there for systems that cannot, for some reason, run the 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__
挂钩的本机实现;这里的代码从不考虑子类。