2012-03-06 38 views
-1

讓我們假設A,B和C是類。 C繼承自A和B,從而將它們用作mixin。正確使用python中的mixins

此時,A可以通過self.whatever訪問B和C上的任何屬性。 B可以通過self.whatever訪問A和C上的任何屬性。而C可以通過self.whatever訪問A和B上的任何屬性。

在python中使用這種「混合」模式時,有哪些應該「知道」如何與其他人交互?例如,C應該只在A/B中使用功能,反之則不然?或者應該A/B只使用C上的功能,但反之亦然?

編輯 - 這是我從另一位作者繼承的代碼。解釋是在python中使用mixin模式時,這是可以接受的設計。你們確認事實並非如此。正如我在下面的評論中提到的,我永遠不會用這種方式去討論面向對象的設計,我會重構代碼。我很樂意看到關於我不明白的「mixin」模式的可能性,因此提出了這個問題。也感謝您的反對票。

+0

對於Python中的類如何工作,您似乎很困惑。你在類之間訪問的例子並不合理。 – Marcin 2012-03-06 21:54:05

+0

「Mixins」在Python中不存在(作爲語法結構;模式可以在代碼中實現)。這是直接的繼承。 – 2012-03-06 22:03:01

+0

@Marcin,我上面提到的*在技術上起作用。這不是我編寫的代碼,我試圖給作者帶來一些好處,因爲Python中使用了mixin模式,這似乎並不理解。在其他面向對象技術中,我已經使用了上面列出的某些部分,甚至在技術上也不可能,即使它們是,它也會是可怕的面向對象設計。我將重構代碼以解決它。 – 2012-03-06 22:30:32

回答

0

Can A可以被自己實例化嗎?如果可以的話,它必須不依賴於C.同上B.關於C.作爲一個泛化,一個可實例化的類只應該依賴於它自己及其超類,從來沒有子類。

這可能有一些例外,超類可能需要知道其子類,但這可能表明由於(通常不希望的)耦合而導致設計不佳。

+1

更糟的是,如果問題中提到'B'將取決於來自'A'的功能。這兩個類沒有共同之處,它們通過一個共同的子類進行連接是偶然的巧合。 – 2012-03-06 22:04:48

+0

完全同意。在我看到的A,B和C代碼庫中,C實際上可以被定義爲一個類。他們分開的唯一原因是爲了避免一個蠻橫的文件。 A和B被認爲是由C繼承的mixin。在少數基地中,A和B彼此依賴,就像你說的那樣,這只是感覺錯誤。更甚於A和B的錯誤取決於被子類化和使用其子類中的功能。這是奇怪的設計,我會重構它。 – 2012-03-06 22:16:56

+0

要回答你的問題,代碼的作者從來沒有打算讓A自己實例化。 – 2012-03-06 22:32:47