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

Inv*_*sus 6 python generator subclassing python-3.x

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

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

gentype = type(somegen())
class subgen(gentype):
    def best_function_ever():
        ...
Run Code Online (Sandbox Code Playgroud)

唉,Python的反应非常恶劣:

"TypeError: Type generator is not an acceptable base type"
Run Code Online (Sandbox Code Playgroud)

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

这绝对是一个开箱即用的问题,所以请不要只是说如果你不能立刻想到一个方法就不可能.Python(特别是Py3)非常灵活.

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

Ser*_*sta 1

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

就拿这个简单的来说:

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

你得到 :

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

您可以将其用于:

def alphastartgen(n=27):
    resul = ""
    for i in alphagen(n):
        resul += i
        yield resul
Run Code Online (Sandbox Code Playgroud)

现在你得到:

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