Реализуйте __getattr__
, как предложено @RomanPerekhrest.Единственная проблема, с которой вы можете столкнуться, заключается в том, что атрибуты вашего экземпляра переопределяют ваши записи dict.Если это не ожидаемое поведение, вы должны реализовать __getattribute__
вместо __getattr__
Примерно так:
class A:
def __init__(self):
self.a = 1
self.b = 2
self.e = 5
self.fields = {'c': 3, 'd': 4, 'e': 6}
def __getattribute__(self, key):
fields = super().__getattribute__('fields')
if key == 'fields':
return fields
try:
return fields[key]
except KeyError:
return super().__getattribute__(key)
a = A()
print(a.a) # 1
print(a.b) # 2
print(a.c) # 3
print(a.d) # 4
print(a.e) # 6 (Note that it returns the entry of the dict rather that the instance attribute)
print(a.f) # Raises exception (not in the instance attributes nor in the dict)