Я понимаю концепцию изменяемых и неизменяемых объектов в Python, нет проблем. Хотя внутреннее значение любого неизменяемого объекта не может быть изменено напрямую, любой экземпляр неизменяемого объекта может быть повторно создан с другими значениями. Я хотел бы построить внутреннюю функцию на подклассе кортежа, который может контролируемым образом переназначить ее собственную ценность. Это может быть базовая функциональность, которую я просто не могу найти, и я был бы признателен за любую помощь.
Например, вот что я хотел бы сделать, но это, очевидно, не работает.
class myTuple(tuple):
def __new__(self):
initialValue = [1, 2, 3]
return super(myTuple, self).__new__(self, initialValue)
def resetMyself(self):
newValue = [4, 5, 6]
self = tuple(newValue)
Со следующими результатами ...
>>> foo = myTuple()
>>> print foo
(1, 2, 3)
>>> foo.resetMyself()
>>> print foo
(4, 5, 6)
Из-за прочтения большего количества ответов на подобные вопросы на этом сайте я знаю, что некоторые из вас могут иметь тенденцию отвечать "Почему вы хотите это сделать?" но давайте сохраним пространство ответов с более прямыми ответами, включая, возможно, «Вы не можете сделать это никоим образом, ни как», если это действительно так.
Большое спасибо всем!
РЕДАКТИРОВАТЬ, СПАСИБО ЗА ОТВЕТ, НИЖЕ, ЗДЕСЬ, ЧТО Я ЗАВЕРШИЛ ...
class semiImmutableList(list):
def __setitem__(self, *args):
raise TypeError("'semiImmutableList' object doesn't support item assignment")
__setslice__ = __setitem__
def __delitem__(self, *args):
raise TypeError("'semiImmutableList' object doesn't support item deletion")
__delslice__ = __delitem__
def append(self, *args):
raise AttributeError("'semiImmutableList' object has no attribute 'append'")
def extend(self, *args):
raise AttributeError("'semiImmutableList' object has no attribute 'extend'")
def insert(self, *args):
raise AttributeError("'semiImmutableList' object has no attribute 'insert'")
def remove(self, *args):
raise AttributeError("'semiImmutableList' object has no attribute 'remove'")
def pop(self, *args):
raise AttributeError("'semiImmutableList' object has no attribute 'pop'")
def __init__(self):
x = [1, 2, 3]
super(semiImmutableList, self).__init__(x)
def resetMyself(self):
super(semiImmutableList,self).append(5)
Любые улучшения / корректировки вышеперечисленного, которые вы можете увидеть, пожалуйста, напишите. Похоже, дублирование повышений AttributeError может быть объединено?