2013-07-18 34 views
2

我在Python Twisted庫中使用LineReceiver類。我從LineReceiver源代碼看到,mdethods setLineMode和setRawMode將類變量line_mode設置爲1或0.還有另一個名爲_buffer的類變量,我假設存儲通過連接發送的數據。Python Twisted LineReceiver類變量?

但爲什麼是line_mode和_buffer類變量?這是否意味着如果我的工廠創建了多個LineReceiver實例(或從LineReceiver繼承的協議),如果我設置line_mode = 1,那麼所有LineReceiver協議實例將進入行模式?這是否也意味着LineReceiver的所有實例只有一個_buffer?我不明白。有人可以解釋這個嗎?

回答

0

好吧我想通了。是的,LineReceiver類確實有類變量_buffer和line_mode。但是,它在LineReceiver方法中實際使用的是具有相同名稱的實例變量。當python創建任何具有類變量的類的實例時,它還會創建具有相同名稱的實例變量,並且這些實例變量具有創建實例時類變量具有的任何值。

因此,例如,實例可以檢查self.line_mode,它是實例變量line_mode的值。如果這是第一次訪問實例變量,它應該具有與相應的類變量相同的值。但是如果你改變它,它會得到一個與類變量不同的新值。我想這只是一些隱藏的東西,在Python的引擎蓋下。

您仍然可以通過訪問LineReceiver.line_mode來獲取類變量line_mode的值。

只是想我會寫這個以防其他人(像我)是新來的蟒蛇,扭曲和困惑。

+0

直到您嘗試更改(分配)'self.line_mode';它指向所有類實例的同一個對象,即Python不會爲類屬性創建單獨的實例變量,而只是屬性查找的工作原理。你可以通過使用諸如list之類的可變對象作爲類屬性來演示它:如果你調用'self.the_list.append(1)';所有其他實例將看到更改的值(因爲它是相同的對象)。 – jfs