Вы можете реализовать свой собственный словарь:
from collections.abc import Mapping
class MissingDict(Mapping):
def __init__(self, d, cls):
self._d = d
self.cls = cls
def __getitem__(self, i):
if i in self._d:
return self._d[i]
self.cls.add_missing_data_column(i)
def __iter__(self): return iter(self._d)
def __len__(self): return len(self._d.keys())
Это сохранит экземпляр словаря и обновит отсутствующий список вашего класса всякий раз, когда вы пытаетесь получить доступ к новому ключу. Используйте как это:
class Basic:
missing_view_data_columns = []
def __init__(self, some_dict):
self.some_dict = MissingDict(some_dict, self)
self.basic_1 = self.some_dict['basic_1']
self.basic_2 = self.some_dict['basic_2']
@classmethod
def add_missing_data_column(cls, column_name):
cls.missing_view_data_columns.append(column_name)
class Specific(Basic):
def __init__(self, some_dict):
super().__init__(some_dict)
self.specific_1 = self.some_dict['specific_1']
self.specific_2 = self.some_dict['specific_2']
rem = Specific({})
print(f"missing_keys: {rem.missing_view_data_columns}")
Отображение:
missing_keys: ['basic_1', 'basic_2', 'specific_1', 'specific_2']