有没有办法在Python 3中子类化生成器?

时间:2014-11-04 14:53:57

标签: python python-3.x generator subclassing

除了显而易见的,我想我会尝试这个,以防万一:

def somegen(input=None):
    ...
    yield
    ...

gentype = type(somegen())
class subgen(gentype):
    def best_function_ever():
        ...
唉,Python的回应非常恶劣:

"TypeError: Type generator is not an acceptable base type"

幸运的是,这对我来说是一个问题。看,我在想,如果我给它一个机会,也许它成为一个有趣的基类型。想象一下我的惊喜! ..并且沮丧。难道没有办法让全能的Python在这个上看到我的方式吗?

这绝对是一个开箱即用的问题,所以请不要说如果你不能立即想办法就不可能。 Python(尤其是Py3)非常灵活。

当然,如果你有证据证明为什么不能(不是"不应该")是基类型(Py3),那么我希望看到并理解这一点。

2 个答案:

答案 0 :(得分:2)

相关的其他问题是Which classes cannot be subclassed?

在接受的答案中有2个原因 - 类型的子类化需要在C中实现,并且它没有为生成器实现,可能是因为没有人看到用例。

生成器对象的源代码是genobject.c,您可以在第349行看到没有设置Py_TPFLAGS_BASETYPE标志。

答案 1 :(得分:1)

您不能使用yield子类化定义为函数的生成器,但您可以在另一个生成器中使用它。

就这么简单:

def alphagen(n=27):
    if n<0 or n > 27: n = 27
    for i in range(n):
        yield chr(ord('A') + i)

你得到:

>>>> [ a for a in alphagen(10)]
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']

您可以在:

中使用它
def alphastartgen(n=27):
    resul = ""
    for i in alphagen(n):
        resul += i
        yield resul

现在你得到:

>>> [ a for a in alphastartgen(8) ]
['A', 'AB', 'ABC', 'ABCD', 'ABCDE', 'ABCDEF', 'ABCDEFG', 'ABCDEFGH']