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__ 挂钩的本机实现;这里的代码从不考虑子类。