所以我有一种情况,其中一个模块编写了一些处理记录的代码,所以可以说它是这样做的:
from datetime import datetime
def is_record_today(rec: Record) -> bool:
return (rec.date == str(datetime.now().date()))
def is_record_valid(rec: Record) -> bool:
return record.is_valid()
所以这个时候我需要定义:
import abc
class Record(abc.ABC):
@abc.abstractproperty
def date(self) -> str:
print('I am abstract so should never be called')
@abc.abstractmethod
def is_valid(self) -> bool:
print('I am abstract so should never be called')
现在,当我在另一个模块中处理记录时,我想从这个抽象类继承,所以如果我没有 date
和 is_valid
,我会引发错误。但是,我还想从另一个类继承以获取默认属性,假设我希望我的记录像字典一样可操作。然后:
class ValidRecord(Record, dict):
@property
def date(self) -> str:
return self['date']
def is_valid(self) -> bool:
return self['valid']
class InvalidRecord(Record, dict):
@property
def date(self) -> str:
return self['date']
我们希望 ValidRecord
应该创建没有问题,InvalidRecord
应该抛出 TypeError
,但是两者看起来都很好,我什至可以调用 Record 类中缺少的抽象方法,到目前为止据我所知,抽象方法不应该是可能的:
data = {
'date': '2021-05-01',
'valid': False
}
InValidRecord(data).is_valid()
>>> "I am abstract so should never be called"
如果我取消字典继承,我会得到预期的错误,那么这里发生了什么,我怎样才能获得从一个类继承但需要添加其他方法的所需行为?