5

我最近惊讶地发现这段代码在 Python 2.7 上运行得很好,但在 Python 3 上会失败。

import datetime

class MyTime(datetime.datetime):
    def __new__(cls, year):
        ob = datetime.datetime.__new__(cls, year, 1, 1)
        return ob

class MySpecialTime(MyTime):
    def __init__(self, *args, **kwargs):
        super(MySpecialTime, self).__init__(*args, **kwargs)

MyTime(2013)
MySpecialTime(2013)

在 Python 3.3 上,最后一行因以下错误而崩溃:

Traceback (most recent call last):
  File "file.py", line 13, in <module>
    MySpecialTime(2013)
  File "file.py", line 10, in __init__
    super(MySpecialTime, self).__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters

Python 2 和 3 之间有什么不同导致此代码仅在 3 上失败?提示 - 向__init__MyTime 添加和方法可解决此问题。我对纠正错误或编写更好的代码不感兴趣(我已经完成了这两件事)。相反,我想了解为什么会发生这种情况,特别是为什么 Python 3.3 的行为会有所不同。

4

1 回答 1

7

这是五年前做出的一项决定的后果,现在使用 Python 3.3 强制执行,即: http ://bugs.python.org/issue1683368

__init__最终被调用的是来自 的那个object,并且那个不会接受参数 - 这是一个设计决策,其推理在错误报告中进行了概述。

于 2013-01-14T18:40:33.123 回答