我最初定义了以下抽象类:
from abc import ABC, abstractmethod
class Primitive(ABC):
现在我想创建另一个继承自Primitive的抽象类:
class InstrumentName(Primitive)
我需要这个类是抽象的,因为我最终想要创建以下两个具体的类:
class CurrencyInstrumentName(InstrumentName)
class MetalInstrumentName(InstrumentName)
我已阅读文档并搜索了SO,但它们主要涉及从抽象类中提取具体类,或讨论Python如何处理抽象
答案 0 :(得分:9)
只是子类,你不需要做任何特别的事情。
只有在实现中不再有abstractmethod
和abstractproperty
个对象时,类才会变得具体。
让我们来说明一下:
from abc import ABC, abstractmethod
class Primitive(ABC):
@abstractmethod
def foo(self):
pass
@abstractmethod
def bar(self):
pass
class InstrumentName(Primitive):
def foo(self):
return 'Foo implementation'
此处InstrumentName
仍然是抽象的,因为bar
保留为abstractmethod
。您无法创建该子类的实例:
>>> InstrumentName()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class InstrumentName with abstract methods bar
子类还可以根据需要添加@abstractmethod
或@abstractproperty
方法。
在幕后,所有子类继承执行此操作的ABCMeta
元类,它只是检查是否还有@abstractmethod
或@abstractproperty
个属性上课。
答案 1 :(得分:4)
正如@MartijnPieters 所写,你不需要为 Python 做任何特别的事情,但 PyCharm 会警告:
<块引用>InstrumentName 类必须实现所有抽象方法
抑制该警告的一种方法:
import abc
class Primitive(abc.ABC):
@abc.abstractmethod
def foo(self):
pass
# noinspection PyAbstractClass
class InstrumentName(Primitive):
def is_tuba(self):
return False
另一种方式:
...
class InstrumentName(Primitive, metaclass=abc.ABCMeta):
def is_tuba(self):
return False