Python 中的抽象方法重写

问题描述 投票:0回答:2

如果我使用

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')
python python-3.x abstract-class
2个回答
0
投票

来自文档:

具有从 ABCMeta 派生的元类的类不能是 除非它的所有抽象方法和属性都被实例化 被覆盖。

向类动态添加抽象方法,或尝试 创建方法或类后修改其抽象状态, 仅支持使用 update_abstractmethods() 函数。


0
投票
class Concrete(MyAbstract):
    hi = None

    ...

这足以允许实例化。该类在实例化时不得有任何用

@abstractXXX
修饰的属性。将继承的
hi
替换为任何其他
hi
就足以实现这一目标。

© www.soinside.com 2019 - 2024. All rights reserved.