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__ 之后,否则无法在构造函数本身中构造类。 我知道可以使用属性装饰器来完成,但我不想将所有属性都转换为属性

解决方法

这可以通过以下方式覆盖 __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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...