除了显而易见的,我想我会尝试这个,以防万一:
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),那么我做希望看到并理解这一点。
答案 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']