正如其他答案中所解释的,是的,您可以使用abc module 在 Python 中使用抽象类。下面我给出一个使用抽象@classmethod、@property 和@abstractmethod 的实际示例(使用Python 3.6+)。对我来说,从我可以轻松复制和粘贴的示例开始通常更容易;我希望这个答案对其他人也有用。
让我们首先创建一个名为Base的基类:
from abc import ABC, abstractmethod
class Base(ABC):
@classmethod
@abstractmethod
def from_dict(cls, d):
pass
@property
@abstractmethod
def prop1(self):
pass
@property
@abstractmethod
def prop2(self):
pass
@prop2.setter
@abstractmethod
def prop2(self, val):
pass
@abstractmethod
def do_stuff(self):
pass
我们的Base 类将始终有一个from_dict classmethod、一个property prop1(只读)和一个property prop2(也可以设置)作为一个名为do_stuff的函数。现在基于Base 构建的任何类都必须实现所有这四个方法/属性。请注意,要使方法成为抽象方法,需要两个装饰器 - classmethod 和抽象 property。
现在我们可以像这样创建一个类A:
class A(Base):
def __init__(self, name, val1, val2):
self.name = name
self.__val1 = val1
self._val2 = val2
@classmethod
def from_dict(cls, d):
name = d['name']
val1 = d['val1']
val2 = d['val2']
return cls(name, val1, val2)
@property
def prop1(self):
return self.__val1
@property
def prop2(self):
return self._val2
@prop2.setter
def prop2(self, value):
self._val2 = value
def do_stuff(self):
print('juhu!')
def i_am_not_abstract(self):
print('I can be customized')
所有必需的方法/属性都已实现,我们当然也可以添加不属于Base 的附加功能(此处为:i_am_not_abstract)。
现在我们可以这样做了:
a1 = A('dummy', 10, 'stuff')
a2 = A.from_dict({'name': 'from_d', 'val1': 20, 'val2': 'stuff'})
a1.prop1
# prints 10
a1.prop2
# prints 'stuff'
根据需要,我们不能设置prop1:
a.prop1 = 100
会回来
AttributeError: 无法设置属性
我们的from_dict 方法也可以正常工作:
a2.prop1
# prints 20
如果我们现在像这样定义第二个类B:
class B(Base):
def __init__(self, name):
self.name = name
@property
def prop1(self):
return self.name
并尝试像这样实例化一个对象:
b = B('iwillfail')
我们会得到一个错误
TypeError: 无法用抽象方法实例化抽象类 B
do_stuff, from_dict, prop2
列出在Base 中定义的所有我们没有在B 中实现的东西。