Python抽象类和多重继承

时间:2021-05-18 21:34:04

标签: python abstract-class multiple-inheritance

所以我有一种情况,其中一个模块编写了一些处理记录的代码,所以可以说它是这样做的:

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')

现在,当我在另一个模块中处理记录时,我想从这个抽象类继承,所以如果我没有 dateis_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"

如果我取消字典继承,我会得到预期的错误,那么这里发生了什么,我怎样才能获得从一个类继承但需要添加其他方法的所需行为?

0 个答案:

没有答案