我有一些代码来做切片:
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
实例。
每个类具有不同构造函数签名的示例
如果类A
和B
有不同的构造函数,那么我们可以创建一个新方法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)