Ответ 1
Вы можете реализовать метод __setattr__
для этой цели - гораздо более надежный, чем __slots__
, который часто неправильно используется для этой цели (например, __slots__
автоматически "теряется", когда класс наследуется от, а __setattr__
сохранится, если явно не переопределено).
def __setattr__(self, name, value):
if hasattr(self, name):
object.__setattr__(self, name, value)
else:
raise TypeError('Cannot set name %r on object of type %s' % (
name, self.__class__.__name__))
Вам нужно убедиться, что hasattr
успешно используется для имен, которые вы хотите установить, например, путем установки атрибутов на уровне класса или с помощью object.__setattr__
в вашем методе __init__
чем прямое назначение атрибута. (Чтобы запретить установку атрибутов в классе, а не в экземплярах, вам придется определить настраиваемый метакласс с аналогичным специальным методом).