gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:14:43 25 4
gpt4 key购买 nike

我有一些代码来做切片:

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>

因此,根据需要,方法 fa 生成 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)

关于python - 继承和切片,使其成为子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22315223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com