Python 包装已经存在的类

Python 包装已经存在的类,python,Python,我遇到了一个错误,循环遍历数据的迭代器在循环回开始之前在集合的末尾给出了比预期的更短的余数。我需要所有的迭代都是完全相同的大小,所以我希望它能去掉剩下的部分。不幸的是,迭代器是作为另一个对象的参数调用的,因此我无法控制何时调用\uuuuu next\uuuu()。想到的解决方案是创建一个自定义类,该类继承自迭代器,并且只重新定义\uuuuuuunext\uuuuuuuuu() 我正试着这样做: class CleanIterator(NumpyArrayIterator): 定义初始(自我,超级

我遇到了一个错误,循环遍历数据的迭代器在循环回开始之前在集合的末尾给出了比预期的更短的余数。我需要所有的迭代都是完全相同的大小,所以我希望它能去掉剩下的部分。不幸的是,迭代器是作为另一个对象的参数调用的,因此我无法控制何时调用
\uuuuu next\uuuu()
。想到的解决方案是创建一个自定义类,该类继承自迭代器,并且只重新定义
\uuuuuuunext\uuuuuuuuu()

我正试着这样做:

class CleanIterator(NumpyArrayIterator):
定义初始(自我,超级):
超级
定义下一个(self,*args,**kwargs):
返回self.next(*args,**kwargs)
def next(自我,*args,**kwargs):
尽管如此:
data=super.next(*args,**kwargs)
#拒绝短数据段
如果数据[0]。形状[0]==self.batch\u大小:
返回数据
#.flow返回一个numpyarray迭代器
data_generator=ImageDataGenerator().流(
有效的\u数据、有效的\u标签,
批次(单位尺寸=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
和函数
\uuu len\uuu()

我试图寻找正确的语法,但我能找到的每个示例都从头开始构建父类,而不是从现有实例开始


所以我想问题是:如何从父类的旧实例创建子类的新实例?

我不确定这是否是您想要的。我很困惑你在问什么,这能回答你的问题吗

class-first:
def测试_功能(自身):
打印('它有效')
instance=first()
次要类(实例类):
“”“此类将功能添加到第一个类的已存在实例”“”
定义初始化(自):
super()。\uuuu init\uuuuu()
def添加了_功能(自):
通过

正如您所看到的,通过使用实例的
\uuu class\uuu
属性,我们可以访问它的类。

我不确定这是否是您想要的。我很困惑你在问什么,这能回答你的问题吗

class-first:
def测试_功能(自身):
打印('它有效')
instance=first()
次要类(实例类):
“”“此类将功能添加到第一个类的已存在实例”“”
定义初始化(自):
super()。\uuuu init\uuuuu()
def添加了_功能(自):
通过

正如您所看到的,通过使用实例的
\uuu class\uuu
属性,我们可以访问它的类。

如果您想要的是过滤,您不能只使用
itertools.filterfalse

import itertools
...
data_generator = itertools.filterfalse(
                    (lambda x:x[0].shape[0] == x.batch_size),
                    data_generator)

如果您想要的是过滤,您不能只使用
itertools.filterfalse

import itertools
...
data_generator = itertools.filterfalse(
                    (lambda x:x[0].shape[0] == x.batch_size),
                    data_generator)
def清洁发生器(fn、索引阵列、发生器):
尽管如此:
数据=fn(索引数组)
#拒收尺寸不足的批次
如果数据[0]。形状[0]==生成器。批次大小:
返回数据
一无所获
data_generator=ImageDataGenerator().流(
有效的\u数据、有效的\u标签,
批次(单位尺寸=100)
原始\u fn=数据\u生成器。\u获取\u转换\u样本的\u批次\u
数据\u生成器。\u获取\u批次\u转换的\u样本=\
lambda索引_数组:clean_(
原,
索引数组,
数据发生器(U)
它非常丑陋,并且没有按照我希望的方式工作,但是它运行着

def clean\u iterator(fn,index\u数组,生成器):
尽管如此:
数据=fn(索引数组)
#拒收尺寸不足的批次
如果数据[0]。形状[0]==生成器。批次大小:
返回数据
一无所获
data_generator=ImageDataGenerator().流(
有效的\u数据、有效的\u标签,
批次(单位尺寸=100)
原始\u fn=数据\u生成器。\u获取\u转换\u样本的\u批次\u
数据\u生成器。\u获取\u批次\u转换的\u样本=\
lambda索引_数组:clean_(
原,
索引数组,
数据发生器(U)

它非常丑陋,并且没有按我希望的方式工作,但它运行时

您的类不是
NumpyArrayIterator
的有效子类,因为您的
\uuuuu init\uuuuuuu()
方法没有调用超类版本的
\uuuu init\uuuuuuuuuuuuuuuuuuuuuo()
,以允许它执行所需的初始化。(无论如何,你的方法毫无意义——将一个参数赋给一个你不使用的局部变量,什么也做不到。)那么,我该如何为超类调用
\uuuu init\uuu()
,并将数据保存在我拥有的超类中。你的类不是
numpyaryderator
的有效子类,因为你的
\uu init\uuu()
方法没有调用超类版本的
\uuuu init\uuu()
以允许它执行所需的初始化。(无论如何,你的方法毫无意义——给一个不使用的局部变量分配一个参数,什么也做不到。)那么,我该如何为超类调用
\uuu init\uuu()
,并将数据保存在我拥有的超类中。对不起,没有。我从中继承的类类型是
numpyaryderator
,让实例告诉我这没有多大帮助。我正在尝试创建一个新对象,它的行为与旧对象完全相同,只是对
\uuu next\uuuu()
做了一个小小的更改。这包括包含旧类中已经存在的所有特定于实例的数据。抱歉,没有。我从中继承的类类型是
NumpyArrayIterator
,让实例告诉我这没有多大帮助。我正在尝试创建一个新对象,它的行为与旧对象完全相同,只是对
\uuu next\uuuu()
做了一个小小的更改。这包括包含所有实例