如果我使用
abc
和抽象方法在 python 中创建一个抽象类,如下所示,并创建一个不使用 def
覆盖抽象方法而是尝试在 init 函数中设置属性的具体类,它会继续抛出我们无法实例化抽象类的错误。我发现我可以通过创建抽象方法的虚拟来解决这个问题。这是推荐的方式吗?
from abc import ABC, abstractmethod
class MyAbstract(ABC):
def __init__(self):
pass
@abstractmethod
def hi(self):
pass
class Concrete(MyAbstract):
def __init__(self, selector):
if selector:
self.hi = self.hi_a
else:
self.hi = self.hi_b
def hi(self):
'''
Is it possible to not have to create this function?
'''
pass
def hi_a(self):
print('a')
def hi_b(self):
print('b')
来自文档:
具有从 ABCMeta 派生的元类的类不能是 除非它的所有抽象方法和属性都被实例化 被覆盖。
和
向类动态添加抽象方法,或尝试 创建方法或类后修改其抽象状态, 仅支持使用 update_abstractmethods() 函数。
class Concrete(MyAbstract):
hi = None
...
这足以允许实例化。该类在实例化时不得有任何用
@abstractXXX
修饰的属性。将继承的 hi
替换为任何其他 hi
就足以实现这一目标。