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

2024-09-30 22:24:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些代码做切片:

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的对象。
如果我重写它,那么我将实现相同的代码两次。

我可以设想一个解决方案,在那里我使用一个助手函数(可能传递一个闭包(函数)来进行构造) 但我希望有更优雅的方式

编辑: 为了澄清,对于父类,子类可能具有不同的构造函数签名。
例如,子类可能有额外的参数。
例如,子类有一个resolution参数。你知道吗


Tags: 对象代码self类型datareturnobjectcreate
1条回答
网友
1楼 · 发布于 2024-09-30 22:24:44

在父级中,使用UnlabelledDataset(data)代替self.__class__(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)

相关问题 更多 >