的方法是使用property
装饰器和__setattr__
魔术方法。下面是一个示例代码:
class ReadOnlyWrapper:
def __init__(self, obj):
self._obj = obj
def __getattr__(self, attr):
return getattr(self._obj, attr)
def __setattr__(self, attr, value):
if attr == '_obj':
super().__setattr__(attr, value)
else:
raise AttributeError("Can't modify read-only object")
# 示例用法
data = {'name': 'John', 'age': 30}
wrapped_data = ReadOnlyWrapper(data)
print(wrapped_data.name) # 输出: John
print(wrapped_data.age) # 输出: 30
wrapped_data.name = 'Jane' # 抛出 AttributeError: Can't modify read-only object
在上面的代码中,ReadOnlyWrapper
类接受一个对象作为参数,并将其保存在_obj
属性中。__getattr__
魔术方法用于获取对象的属性,如果属性不存在,则委托给原始对象进行处理。__setattr__
魔术方法用于设置对象的属性,但在这里我们通过检查attr
是否为_obj
来阻止对原始对象的修改。
这种只读包装类的优势在于它可以保护原始对象的数据不被修改,同时提供了与原始对象相同的接口。它适用于需要对现有对象进行保护的场景,例如在多线程环境中共享对象时,可以确保对象的数据不被意外修改。
腾讯云相关产品和产品介绍链接地址:
请注意,以上链接仅作为示例,实际使用时应根据具体需求选择适合的产品和服务。
领取专属 10元无门槛券
手把手带您无忧上云