我遇到了一个错误,其中循环数据的迭代器在循环回开头之前在集合末尾给出了比预期更短的余数。我需要所有迭代的大小完全相同,因此我希望它删除剩余的部分。不幸的是,迭代器被称为另一个对象的参数,所以我无法控制何时 __next__()
叫做。我想到的解决方案是制作一个继承自迭代器的自定义类,并且仅重新定义 __next__()
.
我尝试按如下方式执行此操作:
class CleanIterator(NumpyArrayIterator):
def __init__(self, _super):
super=_super
def __next__(self, *args, **kwargs):
return self.next(*args, **kwargs)
def next(self, *args, **kwargs):
while True:
data= super.next(*args, **kwargs)
# reject short data snippets
if data[0].shape[0] == self.batch_size:
return data
# .flow return a NumpyArrayIterator
data_generator= ImageDataGenerator().flow(
valid_data, valid_labels,
batch_size= 100)
data_generator= CleanIterator(data_generator)
这设法从多个继承级别继承函数,但似乎只从 NumpyArrayIterator 继承变量。
结果我收到这样的错误:
venv/lib/python3.6/site-packages/keras_preprocessing/image/iterator.py", line 68, in __len__
return (self.n + self.batch_size - 1) // self.batch_size # round up
AttributeError: 'CleanIterator' object has no attribute 'n'
其中 NumpyArrayIterator 继承自 Iterator。迭代器有变量 self.n
和功能__len__()
.
我尝试寻找正确的语法,但我能找到的每个示例都是从头开始构建父类,而不是从现有实例开始。
所以我想问题是:如何从父类的旧实例创建子类的新实例?
最佳答案
我不确定这是否是你想要的。我对你在问什么感到很困惑,这能回答你的问题吗?
class first:
def test_function(self):
print('it works')
instance = first()
class secondary(instance.__class__):
"""This class adds functionality to the already existent instance of the First class"""
def __init__(self):
super().__init__()
def added_function(self):
pass
正如您所见,通过使用实例的 __class__
属性,我们可以访问它的类。
关于python - 包装一个已经存在的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57343832/