我一直在清理处理联系人和客户端保存数据的代码。我的目标是彻底检查我的代码,以便最大限度地提高可维护性,因为我的项目经历了一些严重的代码腐烂。在这样做的过程中,我遇到了继承结构的两难困境。
class SaveFile
是我保存到硬盘上的任何东西的基类。
class GeneralContact(SaveFile)
是任何联系人的基类。
class PersonalContact(GeneralContact)
会跟踪个人联系人的数据,而class CorporateContact(GeneralContact)
则会跟踪公司联系人的数据。
我的困难在于如何为客户构建。有两种类型的客户:个人和公司。
我可以class PersonalClient(PersonalContact)
和class CorporateClient(CorporateContact)
。但是,个人和企业客户端将使用基本相同的方法和属性,因此我将重复代码。
我也可以class GeneralClient
,然后class PersonalClient(PersonalContact, GeneralClient)
和class CorporateClient(CorporateContact, GeneralClient)
,这只需要我实现一次客户端代码,然后覆盖__str__
方法两者。
所以我的问题是,在使用单继承和重复代码,或者使用多重继承并挖掘这些复杂性之间,是否有更好的/更多的pythonic选择?
答案 0 :(得分:0)
所以我的问题是,在 使用单个继承和重复代码,或使用多个 继承并挖掘这些复杂性?
您描述的情况是设计多重继承的目的。有两个单独的可重用代码块。多重继承让您同时使用。
是否遇到“复杂性”取决于情况:
如果两个父类之间没有重叠的方法名称,则多重继承往往与单一继承一样简单。
class A:
def p(self):
pass
class B:
def q(self):
pass
class C(A, B):
'Both A.p() and B.q() are inherited'
如果存在重叠,但仅应运行一种方法,这也很简单。只需对这些类进行排序,以使具有主要重写方法的类排在第一位。
class A:
def p(self):
pass
class B:
def p(self):
pass
class C(A, B):
'Only A.p() is used'
如果存在重叠并且两个父方法都需要运行,则最简单的解决方案是让子方法调用两个父方法。
class A:
def p(self):
pass
class B:
def p(self):
pass
class C(A, B):
'Both A.p() and B.p() are called'
def p(self):
A.p(self)
B.p(self)
的确,唯一复杂的情况是您要设计可以自由混合并且彼此完全分离的合作类。 "Python's super() considered super"中讨论了实现该目标的技术。