Вы можете реализовать метод __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
будет успешным для имен, которые do хотите установить, например, путем установки атрибутов на уровне класса или с помощью object.__setattr__
в ваш __init__
метод, а не прямое присвоение атрибута. (Чтобы запретить установку атрибутов для класса , а не для его экземпляров , вам придется определить собственный метакласс с помощью аналогичного специального метода).