Tôi có một lớp học như:Làm thế nào để làm cho từ điển chỉ đọc bằng Python
class A:
def __init__(self):
self.data = {}
và tại một số thời điểm tôi muốn cấm self.data
lĩnh vực sửa đổi.
Tôi đã đọc trong PEP-416 rejection notice rằng có rất nhiều cách để thực hiện. Vì vậy, tôi muốn tìm thấy những gì họ đang có.
Tôi cố gắng này:
a = A()
a.data = types.MappingProxyType(a.data)
Điều đó sẽ làm việc nhưng trước tiên, python3.3 của nó + và thứ hai, khi tôi làm điều này "cấm" nhiều lần tôi có được điều này:
>>> a.data = types.MappingProxyType(a.data)
>>> a.data = types.MappingProxyType(a.data)
>>> a.data
mappingproxy(mappingproxy({}))
dù sẽ tốt hơn nếu chỉ nhận được mappingproxy({})
vì tôi sẽ "cấm" nhiều lần. Kiểm tra isinstance(MappingProxyType)
là một tùy chọn, nhưng tôi nghĩ rằng các tùy chọn khác có thể tồn tại.
Cảm ơn
http://stackoverflow.com/questions/8752451/how-to-change-the-behavior -of-a-python-dictionarys-setattr có thể giúp bạn – Garfield
Việc triển khai frozendict trông khá tầm thường: https://github.com/slezica/python-frozendict/blob/master/frozendict/__init__.py – georg
@codelover Đúng vậy, Tôi có thể ghi đè '__setitem__' bằng' throw NotImplemented'. Có đảm bảo rằng sẽ không có cách nào để sửa đổi các khóa hoặc giá trị thông qua bất kỳ thuộc tính 'dict' chuẩn nào trong bất kỳ triển khai python nào không? – sshilovsky