在Python中,为什么我不能简单地继承pandas.Series?
我想创建一个新的类,这个类是从pandas.Series继承来的。在Python中,创建一个子类通常没什么问题,但在这个情况下我遇到了一些麻烦。
这里有一个简单的继承示例:
class Test(object):
def __new__(cls, *args, **kwargs):
print "new Test"
return object.__new__(cls, *args, **kwargs)
def __init__(self):
print "init Test"
class A(Test):
def __new__(cls, *args, **kwargs):
print "new A"
return Test.__new__(cls, *args, **kwargs)
def __init__(self):
print "init A"
print "creating an instance of A"
a = A()
print "type: ", type(a)
这个示例的输出是:
creating an instance of A
new A
new Test
init A
type: <class '__main__.A'>
现在我们来试试用Series:
import pandas as pd
class subSeries(pd.Series):
def __new__(cls, *args, **kwargs):
print "new subSeries"
return pd.Series.__new__(cls, *args, **kwargs)
def __init__(self):
print "init subSeries"
print "creating an instance of subSeries"
s = subSeries()
print "type: ", type(s)
结果是:
creating an instance of subSeries
new subSeries
type: <class 'pandas.core.series.Series'>
为什么s是一个Series,而不是一个子Series呢?
相关问题:
1 个回答
1
在pandas的github网站上,有一个关于这个话题的问题被记录下来了:
https://github.com/pydata/pandas/issues/60
我在为一个光谱库数据格式(按波长索引)创建Series的子类时,也遇到了这个问题。过程相当麻烦,需要进行很多“猴子补丁”(也就是临时修改代码)和编写一些方法,这些方法会明确调用Series的方法,但在返回之前会把它换成我的Spectrum类。我需要在new和init中定义一些逻辑。
这个问题似乎与Cython和Python的混合使用,以及numpy的C API有关,还有就是对_constructor()方法的不一致使用。不过,我最近没有关注这个问题。我知道Dataframe和Series的父类从ndarray变成了一个不同的中间类NDFrame,或者说这个过程可能还在进行中。