Mam klasy takich jak:Jak słownika tylko do odczytu w Pythonie
class A:
def __init__(self):
self.data = {}
iw pewnym momencie chcę zabraniać self.data
Pola modyfikacji.
Przeczytałem w PEP-416 rejection notice, że istnieje wiele sposobów, aby to zrobić. Więc chciałbym znaleźć to, czym są.
Próbowałem to:
a = A()
a.data = types.MappingProxyType(a.data)
To powinno działać, ale po pierwsze, jego python3.3 + i drugi, kiedy to zrobić "zakaz" wiele razy mam to:
>>> a.data = types.MappingProxyType(a.data)
>>> a.data = types.MappingProxyType(a.data)
>>> a.data
mappingproxy(mappingproxy({}))
chociaż byłoby znacznie lepiej uzyskać tylko mappingproxy({})
, ponieważ zamierzam "zakazać" wiele razy. Sprawdzanie isinstance(MappingProxyType)
jest opcją, ale myślę, że mogą istnieć inne opcje.
Dzięki
http://stackoverflow.com/questions/8752451/how-to-change-the-behavior -of-a-python-dictionarys-setattr może ci pomóc – Garfield
Implementacja frozendict wygląda dość trywialnie: https://github.com/slezica/python-frozendict/blob/master/frozendict/__init__.py – georg
@codelover To prawda, Mogę przesłonić '__setitem__' z' throw NotImplemented'. Czy istnieje gwarancja, że nie będzie możliwości modyfikacji kluczy lub wartości za pomocą standardowych atrybutów 'dyktowanych 'w jakiejkolwiek implementacji pythona? – sshilovsky