So I have a situation where one module writes some code that processes records, so lets say it does this:
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()
so at this time I need to define:
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')
now when I am processing a record in another module I want to inherit from this abstract class so I raise an error if I don't have date and is_valid. However, I also want to inherit from another class to get the default properties, lets say I want my record to be manipulatable like a dictionary. Then:
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']
   
we would expect that ValidRecord should create without issue and InvalidRecord should throw TypeError, however both seem fine, and I can even call the missing abstractmethod from the Record class which as far as I understand abstract methods should not be possible:
data = {
    'date': '2021-05-01',
    'valid': False
}
InValidRecord(data).is_valid()
>>> "I am abstract so should never be called"
If I take away the dictionary inheritance I get the expected error so, what is going on here and how can I get the desired behavior of inheriting from one class but requiring additional methods be added?