我遇到了一个错误,在该错误中,遍历数据的迭代器在返回到开始之前在集合的末尾提供了比预期短的余数。我需要所有迭代的大小都完全相同,因此我希望它删除剩余的部分。不幸的是,迭代器被称为另一个对象的参数,因此我无法控制何时调用__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/

10-14 17:42
查看更多