继承和切片,使其成为子类型



我有一些代码来做切片:

class UnlabelledDataset(Dataset):
    ...
    def __getitem__(self,sliceIndex):
        data = self.data[sliceIndex]
        if np.size(data) and not isinstance(sliceIndex, (int,long)):
            return UnlabelledDataset(data) #Create Sliced Object
        else:
            return data

我想继承这个类来添加功能。从子类切片,应该返回子类型的对象所有领域都完好无损。
我该怎么做呢?
如果我不重写__getitem__,(基本上重新实现父类中的内容,除了标记为#Create Sliced Object的行)。
然后切片将返回一个类型为UnlabelledDataset的对象。
如果我重写它,那么我将两次实现相同的代码。

我可以设想一个解决方案,我使用一个辅助函数(可能有一个闭包(函数)传入做构造)但我希望有一种更优雅的方式

编辑:

为了澄清,子类可能具有与父类不同的构造函数签名。
例如,子类可能有额外的参数。
例如,子类有一个分辨率参数

在父元素中,用self.__class__(data)代替UnlabelledDataset(data)。这将在两个类中产生正确的答案。

作为一个极简主义的例子:

class A(object):
    def __init__(self, data=None):
        self.data = data
    def f(self, data):
        return self.__class__(data)
class B(A):
    pass

在ipython命令行测试时:

In [15]: a = A()
In [16]: a.f('aaa')
Out[16]: <__main__.A at 0x2e99610>
In [17]: b = B()
In [18]: b.f('bbb')
Out[18]: <__main__.B at 0x2e99790>

因此,方法f在从a调用时产生一个新的A实例,在从b调用时产生一个新的B实例。

每个类具有不同构造函数签名的示例

如果类AB有不同的构造函数,那么我们可以创建一个新方法make_new来处理差异:

class A(object):
    def __init__(self, data, x):
        self.data = data
        self.x = x
    def make_new(self, myslice):
        return self.__class__(self.data[myslice], self.x)
    def f(self, myslice):
        return self.make_new(myslice)
class B(A):
    def __init__(self, data, x, y):
        self.data = data
        self.x = x
        self.y = y
    def make_new(self, myslice):
        return self.__class__(self.data[myslice], self.x, self.y)