【发布时间】:2021-09-11 14:23:44
【问题描述】:
我有一个父类 A 有几个继承自它的类 (B,C,...)。
我有一些函数is_class_A 在A 中实现,我想以同样的方式在B 和C 中覆盖它。
让我们说:
class A:
def is_class_A():
print("We are in class A")
class B(A):
def is_class_A():
print("Nope")
class C(A):
def is_class_A():
print("Nope")
请注意,在 A 类和其他类中实现的这两个函数都很长,而且更复杂。
我想到了2个解决方案,以避免B,C实现中的重复:
在课堂上使用C:
def is_class_A():
return B.is_class_A()
我不确定这将如何发挥作用,因为C 的对象不是B 的对象。而且我没有在这里传递任何self,所以我看不出这是如何工作的,也许类似的东西可以?
下一个解决方案是使用另一个遗产:
class C(B)
这并不总是有效,因为并非总是可行(如果它们具有不同的属性)并且可能不符合设计目的。
到目前为止,我最好的尝试是使用另一个类:
class BC(A):
def is_class_A():
print("Nope")
class B(BC):
pass
class C(BC):
pass
你怎么看?还有一些想法?也许是一些不涉及程序设计的更技术性的东西?
谢谢。
【问题讨论】:
-
我认为您的前两个解决方案很糟糕,因为它们混合了与层次结构无关的类的功能,正如您所说(“可能不符合设计目的”)。只要您的类层次结构没有变得太深,中间类
BC就不是一个坏主意。只要您不为每个常见功能引入一个层次结构级别,就可以了。您还可以查看 Python 中的多重继承。 -
我熟悉多重继承。您建议在其中固有
B,C都有一个新类,并在那里实现它?但在我的函数中,我可能会使用A拥有的许多属性.. 听起来很复杂 -
您可以在单独的类
Z中定义您的isClassA覆盖,然后使用class B(Z, A): ...。请注意,Z必须先出现,以确保优先使用Z.isClassA而不是A.isClassA。不过,我不确定我是否真的喜欢这个主意;混入通常会添加新功能,而不是覆盖现有功能。我想我也会选择中级BC课程。不过,我不知道您是否真的可以根据这个示例做出正确的设计决策:它太抽象了。
标签: python inheritance overriding code-duplication