Python создает класс-оболочку только для чтения без изменения обернутого класса

У меня есть базовый класс, который выглядит следующим образом:

class Base:
    def __init__(self, prop):
        self.prop = prop

Я хочу создать класс-оболочку ReadonlyWrapper, доступный только для чтения, со следующими функциями:

# Create instance using __init__ of base class.
readonly_instance = ReadonlyWrapper()

# I can access properties
prop = readonly_instance.prop

# This should raise a PermissionError
readonly_instance.prop = 23

Точнее я хочу, чтобы все поля класса были доступны только для чтения, но только после вызова __init__, иначе класс не может быть построен в самом конструкторе. Я знаю, что это можно сделать с помощью декоратора свойств, но я не хочу превращать все атрибуты в свойства.


person Christian Baumann    schedule 18.03.2021    source источник


Ответы (1)


Этого можно добиться, переопределив __setattr__ следующим образом:

class ReadonlyWrapper(Base):
    _initialized = False

    def __init__(self, *args, **kwargs):
        super(ReadonlyWrapper, self).__init__(*args, **kwargs)
        self._initialized = True

    def __setattr__(self, key, value) -> None:
        if self._initialized:
            raise PermissionError()
        else:
            super().__setattr__(key, value)

Как только _initialized установлено на True, любая попытка установить атрибут вызовет PermissionError.

person Christian Baumann    schedule 18.03.2021