TypeError:object .__ init __()不带参数

时间:2016-04-30 02:34:39

标签: python python-3.x inheritance

我对Python中的这种继承行为感到困惑。据我所知,虽然语法不同于2.7到3.5,但正在正确调用超类构造函数。

Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec  6 2015, 18:08:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> 
>>> import pandas as pd
>>> class MyTimestamp(pd.Timestamp):
...     def __init__(self, arg, **kwargs):
...         super(MyTimestamp, self).__init__(arg, **kwargs)
... 
>>> a=MyTimestamp(1312342152423, unit='us')
>>> a
Timestamp('1970-01-16 04:32:22.152423')

使用Python 3.5.1解释器我得到以下结果,两者都安装了相同版本的Pandas(0.18.0),但我相信它更像是Python继承的东西。

Python 3.5.1 |Continuum Analytics, Inc.| (default, Dec  7 2015, 11:16:01) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import pandas as pd
>>> class MyTimestamp(pd.Timestamp):
...     def __init__(self, arg, **kwargs):
...         super().__init__(arg, **kwargs)
... 
>>> a=MyTimestamp(1312342152423, unit='us')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__

TypeError: object.__init__() takes no parameters

mro的{​​{1}}指定:

MyTimestamp

所以(<class '__main__.MyTimestamp'>, <class 'pandas.tslib.Timestamp'>, <class 'pandas.tslib._Timestamp'>, <class 'datetime.datetime'>, <class 'datetime.date'>, <class 'object'>) 不是解决方案顺序中的下一个类。这个错误来自哪里,也许更多的是我正在做错误的事情,我可以改变以解决问题?

2 个答案:

答案 0 :(得分:3)

我认为这与你对super的使用没有任何关系。如果你用另一个类测试相同的代码,它可以正常工作。 E.g:

class Foo:
    def __init__(self, arg):
        print ("Foo",arg)

class Bar(Foo):
    def __init__(self, arg):
        super().__init__(arg)

b=Bar(1) #Prints "Foo 1"

似乎Pandas正在使用Timestamp类做一些奇怪的事情,我无法弄清楚是什么,但它与C扩展有关:

https://github.com/pydata/pandas/blob/master/pandas/tslib.pyx#L222 https://github.com/pydata/pandas/blob/master/pandas/tslib.pyx#L881

无论如何,以下似乎按预期工作:

import pandas

class MyTimestamp(pandas.Timestamp):
    def __init__(self, arg, **kwargs):
        pass

a=MyTimestamp(1312342152423, unit='us') #Timestamp('1970-01-16 04:32:22.152423')

另外,请看一下这两个定义之间输出的变化:

import pandas

class MyTimestamp(pandas.Timestamp):
    def __init__(self, arg, **kwargs):
        print(super().__init__)

class Foo:
    def __init__(self, arg):
        print ("Foo",arg)

class Bar(Foo):
    def __init__(self, arg):
        print(super().__init__)

a=MyTimestamp(1612342152423, unit='us')
b=Bar(1)

哪个收益率:

<method-wrapper '__init__' of MyTimestamp object at 0x04981AD0>
<bound method Foo.__init__ of <__main__.Bar object at 0x033C2070>>

答案 1 :(得分:3)

问题在于,在这种情况下,您应该覆盖__new__。似乎熊猫的时间戳是不可变的(就像它继承的日期时间一样)所以它的__init__方法什么都不做。

你编写它的方式可以正常使用python 3.用你自己的自定义类替换pd.Timestamp,你会看到super被正常调用。

类似的问题和解决方案:Python: how to extend datetime.timedelta