Этот метакласс обеспечивает "мелкую" неизменность. Например, это не мешает
immutable_obj.attr.attrs_attr = new_value
immutable_obj.attr[2] = new_value
В зависимости от того, принадлежит ли объект attrs_attr объекту или нет, это может рассматриваться как нарушение истинной неизменности. Например. это может привести к следующему, что не должно происходить для неизменяемого типа:
>>> a = ImmutableClass(value)
>>> b = ImmutableClass(value)
>>> c = a
>>> a == b
True
>>> b == c
True
>>> a.attr.attrs_attr = new_value
>>> b == c
False
Возможно, вы могли бы исправить этот недостаток, переопределив getattr , а также вернуть некоторую неизменную оболочку для любого возвращаемого атрибута. Это может быть сложно. Можно было бы блокировать прямые вызовы setattr , но как насчет методов атрибута, которые устанавливают его атрибуты в своем коде? Я могу думать об идеях, но это будет довольно мета, хорошо.
Кроме того, я думал, что это будет разумное использование вашего класса:
class Tuple(list):
__metaclass__ = Immutable
Но это не сделало кортеж, как я надеялся.
>>> t = Tuple([1,2,3])
>>> t.append(4)
>>> t
[1, 2, 3, 4]
>>> u = t
>>> t += (5,)
>>> t
[1, 2, 3, 4, 5]
>>> u
[1, 2, 3, 4, 5]
Я полагаю, что методы списка в основном или полностью реализованы на уровне C, поэтому я полагаю, что ваш метакласс не имеет возможности перехватывать изменения состояния в них.