两者之间有什么更好的选择?我认为他们都提供相同的解决方案,但哪一个更适合在MVC架构中选择?在下面的代码中,Parent
类是Model的一部分,Child
类是Controller的一部分:
class Parent():
def parent_function(self):
print("parent class")
#passing parent as argument
class Child(Parent):
def child_function(self):
return super().parent_function()
#referencing parent on __init__
class Child():
def __init__(self):
self.parent = Parent()
super().__init__()
def child_function(self):
return self.parent.parent_function()
谢谢
答案 0 :(得分:4)
他们不是一回事。
前者使用继承,这意味着Parent
中的所有方法和属性都可以在Child
中使用。后者使用组合,其中Child
个实例保留对Parent
的(私有)引用。自动继承"复制"基础对象的功能,同时允许更改细节,但强制子对象实现父对象的相同接口。作文并没有强制这一点,允许更多的灵活性,但管理复杂的作曲链 - 可能是一个挑战。
无论你走哪个方向,只有当基类和派生类功能相似但细节不同时才应使用它们(例如Dog和Chihuahua / GoldenRetriever)。在您的评论中,您说要在MVC应用程序中链接模型和控制器,然后您只需要在控制器类中保留对模型的引用,并在必要时调用模型上的相关方法。由于模型和控制器是完全不同的东西,继承/组合在这里没有意义。
(顺便说一下,在第二个解决方案super()
中没有做什么作为"父类"在这种情况下是object
,而不是Parent
。)
答案 1 :(得分:2)
他们肯定不是同一个解决方案。您的第二个示例将调用Child
对parent_function
的定义,这在您的代码中不存在,而您的第一个示例将调用Parent
类的定义parent_function
,我们认为它存在。
同样在第二个示例中,调用super().__init__()
无效,因为Child
的唯一超类是object
。
您好像在询问组合和继承之间的区别,这通常是个人偏好的问题,并且通常需要回答"是" vs."有一个"输入问题。有关如何使用组合而不是继承来实现类似功能的更好示例如下所示:
class Child:
def __init__(self):
self.parent_obj = Parent()
def child_function(self):
return self.parent_obj.parent_function()
答案 2 :(得分:1)
这称为继承与组合。区别在于范围,通过继承,您可以直接访问子类中的每个父属性或方法,而在第二种情况下,您必须明确地为其提供访问权限。有时您可能希望隐藏对象API的某些部分,因此包装(组合)是可行的方法,有时您只想扩展基类,继承是最佳选择。
答案 3 :(得分:1)
使用继承(第一个)和组合(第二个)获得相同的解决方案。我更喜欢第二个。