问题描述
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
。