python类子类或实例

时间:2012-12-10 17:22:19

标签: python class inheritance instance subclass

这是我使用python类和子类的第一个例子。这里的一个问题是属性ParentUI被覆盖。

class OptUI(object):
def __init__(self, ParentUI):
    self.ParentUI = ParentUI

class ListUI(object):
    def __init__(self, ParentUI):
        self.ParentUI = ParentUI

class Window(OptUI, ListUI):
    MainFrame = "MainFrame"
    TestFrame = "TestFrame"
    def __init__(self):
        OptUI.__init__(self, self.MainFrame)
        ListUI.__init__(self, self.TestFrame)

如果我在Window类中使用实例而不是继承,那么有一个解决方案。

class Window(object):
    MainFrame = "MainFrame"
    TestFrame = "TestFrame"
    def __init__(self):
        self.OUI = OptUI(self.MainFrame)
        self.LUI = ListUI(self.TestFrame)

在第二种情况下,我有一个属性ParentUI的准命名空间。那么这是一种实践中的好方法吗?这是怎么解决的?

1 个答案:

答案 0 :(得分:2)

我认为您需要考虑您的类如何相互关联,然后使用它来确定代码的结构。

继承意味着两个类之间的IS-A关系。也就是说,派生类的实例是基类的实例。在您的原始代码中,Window类正在尝试从OptUIListUI继承,如果这两者可以以有意义的方式重叠并且Window可能会有意义对象可以一次 。但是,由于基类都希望ParentUI变量具有不同的值,因此同时将它们作为两个变量可能没有意义(尽管它也可能只是{{1}的设计缺陷}或OptUI类)。你应该对此有自己的结论,因为我不知道你的课程究竟是什么意思。

另一方面,包括UI类的实例(称为“组合”)不会对ListUI类应具有的接口做出任何声明。它建议使用HAS-A关系,因为每个Window实例都有 Window实例和OptUI实例。如果这比IS-A关系更有意义,那么组合绝对是可行的方法。

做一些事情也可能有意义。也就是说,从一个UI类继承,同时包含另一个的实例。 ListUI实例可能 Window个实例,而拥有 OptUI个实例。