我不确定如何说出这个问题,因此这个奇怪的标题。我也无法在搜索后找到任何关于此的信息,所以希望这不是重复的,我只是在寻找错误的单词。无论如何,在这种情况下,我有一个抽象的基类,里面有一些方法,它们由一个类继承。我不想在这个基类中设置其中一个方法,因为这个类要由其他类继承,以提供它们共享的通用功能。类似的东西:
class A(metaclass=abc.ABCMeta):
@abc.abstractmethod
def fun1(self):
pass
@abc.abstractmethod
def fun2(self):
pass
class B(A):
def fun1(self):
#do work here
@abc.abstractmethod
def fun2(self): # Intent to have the final classes define this
pass
class C(B):
def fun2(self):
# do work here
class D(B):
def fun2(self):
# do work here
我想将该函数保留为ABC.meta以强制执行最终的子节点,但因为在这种情况下可以有多种类型的B都继承自接口,我想保持最初的虚拟化在这个根类的方法,但有一种方法让B类强制它的子类必须实现这一点。如果我没有将抽象方法添加到类B中,代码就可以找到,但这很尴尬,因为子类必须实现该方法,并且不应该一直看到接口以找出他们需要实现的所有内容。如上所述,它会出错,因为B类不能将该方法声明为abc.abstract。如果我没有将它声明为抽象,则无法强制执行子类必须实现该方法。
我希望我这种令人费解的写作方式对那里的人有意义......
谢谢!
答案 0 :(得分:0)
您可能不应将fun2
重新定义为具体类B
中的抽象方法。您正在为界面创建一组规则,但在执行此操作时会立即违反这些规则。
相反,要么定义混合类,要么C
和D
可以继承的其他ABC。
class A(metaclass=abc.ABCMeta):
@abc.abstractmethod
def fun1(self):
pass
class A2(metaclass=abc.ABCMeta):
@abc.abstractmethod
def fun2(self):
pass
class B(A):
def fun1(self):
print('hello')
class B2(A2):
def fun2(self):
print('world')
class C(B, B2):
pass
class D(B, B2):
pass