2014-11-04 62 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

相關問題