Хотя я никогда не нуждался в этом, мне просто показалось, что создание неизменяемого объекта на Python может быть несколько сложным. Вы не можете просто переопределить __setattr__
, потому что тогда вы даже не можете устанавливать атрибуты в __init__
. Подклассификация кортежа - это трюк, который работает:
class Immutable(tuple):
def __new__(cls, a, b):
return tuple.__new__(cls, (a, b))
@property
def a(self):
return self[0]
@property
def b(self):
return self[1]
def __str__(self):
return "<Immutable {0}, {1}>".format(self.a, self.b)
def __setattr__(self, *ignored):
raise NotImplementedError
def __delattr__(self, *ignored):
raise NotImplementedError
Но тогда у вас есть доступ к переменным a
и b
через self[0]
и self[1]
, что раздражает.
Возможно ли это в Pure Python? Если нет, как мне сделать это с расширением C?
(Ответы, которые работают только на Python 3, приемлемы).
Обновление:
Так что подклассифицирующий кортеж - это способ сделать это в Pure Python, который хорошо работает, за исключением дополнительной возможности доступа к данным с помощью [0]
, [1]
и т.д. Итак, для завершения этого вопроса все, что отсутствует, сделайте это "правильно" на C, который, как я подозреваю, будет довольно простым, просто не реализуя никаких geititem
или setattribute
и т.д. Но вместо того, чтобы делать это сам, я предлагаю щедрость за это, потому что я ленив,:)