我正在考慮如何使用super
在python中製作管道。我有一系列的變革,我必須做一個流的,我覺得做一個好辦法是東西的線路:使用super製作管道?
class MyBase(object):
def transformData(self, x):
return x
class FirstStage(MyBase):
def transformData(self, x):
y = super(FirstStage, self).transformData(x)
return self.__transformation(y)
def __transformation(self, x):
return x * x
class SecondStage(FirstStage):
def transformData(self, x):
y = super(SecondStage, self).transformData(x)
return self.__transformation(y)
def __transformation(self, x):
return x + 1
它的工作原理,因爲我打算,但有一個潛在的重複。如果我有N個階段,我將有N個完全相同的transformData
方法,其中唯一改變的是當前類的名稱。
有沒有辦法去掉這個樣板?我嘗試了一些東西,但結果僅向我證明,我還沒有完全理解super
是如何工作的。
我想要的東西是隻定義方法__transformation
自然繼承transformData
方法會上漲的MRO,調用類的transformData
方法,然後再調用當前類的結果__transformation
。是否有必要爲每個兒童課程定義一個新的相同transformData
?
我同意這是實施管道的一種不好的方式。這可以通過更簡單(更清晰)的方案來完成。我認爲這是對現有模型所做的最少修改,以便在不修改代碼的情況下從現有類中獲取管道。我同意這不是最好的辦法。這將是一個騙局,應該避免招數。此外,我認爲這是一種更好理解super
如何工作的方式。
Buuuut。出於好奇......是否有可能在上述方案中沒有transformData
重複?這是一個真正的疑問。有沒有一種方法可以繼承transformData
,其方法是將super
中的調用更改爲在當前類上調用?
這將是一個非常不清楚,不可讀,聰明的屁股欺騙。我知道。但是有可能嗎?
我不知道如果我理解正確,澄清這一點: 如果你有階段爲(C1)s_beg - >(C2)s_common - >( C3)s_common - >(C4)s_common - >(C5)s_mid - >(C6)s_com_2 - >(C7)s_com_2 - >(C8)s_end 現在如果您的類s_common只在C2中實現一次,那麼s_com_2(只有在C6),那麼你不需要有相同功能的多個副本。當調用沒有在C7中找到func的定義時,它將自動按照層次結構上升,並根據調用嘗試獲取最高級的轉換函數(s_common或s_com_2)。 我不確定是否正確理解問題。 – pranshus
@pranshus似乎有一個你想讓我澄清的具體問題,但不知怎的,文本丟失了。 –
對不起,我完成我的評論之前按回車。 – pranshus