2014-11-04 66 views
5
从明显

除此之外,我想我会尝试这一点,以防万一:有没有办法在Python 3中创建一个生成器的子类?

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)非常灵活。

当然,如果你有它为什么不能(不是“不应该”)是一个基本类型(PY 3),然后我想看到和理解的证据。

+0

'generator'是'method'的一种。 'class'只能从其他'class'继承。这将类似于开车开车。我可以理解这种沮丧,因为我认为python应该能够做任何事情,但我明白为什么他们不会花时间去实现它。 – 2014-11-04 15:52:50

+0

@FarmerJoe我不确定我是否能够得到类比,但'方法'本质上(甚至实际上)是'function'的一个子类型。此外,一切都是一种类型,甚至自己类型;) – Inversus 2014-11-06 22:45:01

+0

@FarmerJoe我的意思是,在封面下,一切都是'class',甚至'generator'。在内部深处,人们肯定会发现一些C类的“类生成器(函数)”,它就是我期待的“子类”类(即:我非常高兴做其他事情,使我具有类似的灵活性) 。 – Inversus 2014-11-06 22:58:25

回答

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'] 
+0

这是一个令人着迷的角度..我要去玩它一段时间。我会回来的。谢谢 – Inversus 2014-11-06 22:54:16

+0

我又回来玩了一下,我得说:“哦,这是好东西。”像一个类定义一样处理外部生成器(函数)定义正是我所希望的那种疯狂的破解。非常感谢你。 – Inversus 2014-11-12 18:32:44

2

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

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

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

+1

Ooo。这很好。这是唯一阻止我继承一个gen的东西吗?内部的其他部分是否需要说服?这可以在运行时完成(monkeypatch?)还是需要进行自定义构建? (我试图避免这一刻的一条漫长的道路哈哈) – Inversus 2014-11-06 22:49:16

+0

另外..你是怎么找到那个标志的?就像,你刚刚知道它,或者你在那里遵守了代码或什么? – Inversus 2014-11-06 22:50:30

+0

我谷歌搜索,并找到了我链接到的前一个堆栈溢出线程,并阅读它...并且该标志还不够,还必须_implement_它将如何工作(请参阅列表的代码),以及重新编译Python。 – RemcoGerlich 2014-11-07 17:51:00

相关问题