孩子打电话给父母回电给孩子......或不

时间:2015-05-26 16:12:24

标签: python inheritance operator-overloading python-datetime

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

1 个答案:

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