Python 子项调用父项,父项调用子项。。。还是不

Python 子项调用父项,父项调用子项。。。还是不,python,inheritance,operator-overloading,python-datetime,Python,Inheritance,Operator Overloading,Python Datetime,为什么第一个print调用使用重写的方法,而第二个不使用?我不明白。第二种情况似乎也在python实现中调用-self 我确信我在这里遗漏了一些东西,但是没有理由B2调用\uuuuu neg\uuuu。timedelta基类肯定不会使用它 B1()。\uuuu abs\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 请注意

为什么第一个print调用使用重写的方法,而第二个不使用?我不明白。第二种情况似乎也在python实现中调用
-self

我确信我在这里遗漏了一些东西,但是没有理由
B2
调用
\uuuuu neg\uuuu
timedelta
基类肯定不会使用它

B1()。\uuuu abs\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

请注意,此处不涉及此问题;该代码适用于因某种原因无法运行以下命令的系统:

静态PyObject*
delta_abs(PyDateTime_delta*self)
{
PyObject*结果;
断言(GET_TD_微秒(self)>=0);
断言(GET_TD_SECONDS(self)>=0);
如果(获得天数(自我)<0)
结果=delta_阴性(自身);
其他的
结果=delta_阳性(自身);
返回结果;
}

其中是
钩子的本机实现;代码在这里从不考虑子类。

因为
-self
使用
\uuuu neg\uuu
?为什么
B2
?@MartijnPieters:这是传递给
B2
-1
的意图,我想:@minitech:不要将Python参考实现与C实现混淆。:-)是的,我认为OP混淆了
\uuuuu neg\uuuuu
\uuuu sub\uuuu
)我认为假设是
时间增量
需要
\uuuu neg\uuuu
将负输入转换为正输入。但它似乎否定了组成部分。我能骗我的系统使用python实现而不是C实现吗?@wim:如果没有最后几行代码,就需要重新运行模块。将
datetime.py
文件加载到字符串中,从
try:import\u datetime
开始删除行,使用创建替换模块对象并将其填充到
sys.modules['datetime']
中。超级黑客,你说得对。我尝试了你的“破解”,看到了我最初期望的输出(B1的
neg
;B2的
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