这是我使用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的准命名空间。那么这是一种实践中的好方法吗?这是怎么解决的?
答案 0 :(得分:2)
我认为您需要考虑您的类如何相互关联,然后使用它来确定代码的结构。
继承意味着两个类之间的IS-A关系。也就是说,派生类的实例是基类的实例。在您的原始代码中,Window
类正在尝试从OptUI
和ListUI
继承,如果这两者可以以有意义的方式重叠并且Window
可能会有意义对象可以一次 。但是,由于基类都希望ParentUI
变量具有不同的值,因此同时将它们作为两个变量可能没有意义(尽管它也可能只是{{1}的设计缺陷}或OptUI
类)。你应该对此有自己的结论,因为我不知道你的课程究竟是什么意思。
另一方面,包括UI类的实例(称为“组合”)不会对ListUI
类应具有的接口做出任何声明。它建议使用HAS-A关系,因为每个Window
实例都有 Window
实例和OptUI
实例。如果这比IS-A关系更有意义,那么组合绝对是可行的方法。
做一些事情也可能有意义。也就是说,从一个UI类继承,同时包含另一个的实例。 ListUI
实例可能 是Window
个实例,而拥有 OptUI
个实例。