我对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'>)
不是解决方案顺序中的下一个类。这个错误来自哪里,也许更多的是我正在做错误的事情,我可以改变以解决问题?
答案 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