2012-03-06 36 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