Ответ 1
Чтобы немного рассказать о Elazar, вы хотите переопределить __setattr__
магический метод и проверьте его, чтобы узнать, существует ли атрибут. Если нет, вызовите исключение. Вот что это могло бы выглядеть для вашего класса:
def __setattr__(self, name, value):
if not hasattr(self, name): # would this create a new attribute?
raise AttributeError("Creating new attributes is not allowed!")
super(C, self).__setattr__(name, value)
Также возможно переопределить __getattr__
или __getattribute__
, если вы хотите иметь дело с запросами на несуществующие атрибуты, но для конкретной проблемы, о которой вы описали, это, вероятно, не нужно.
Обратите внимание, что метод __setattr__
, показанный выше, не будет полностью хорошо воспроизводиться с вашим текущим свойством из-за делетера. Если вы удалите myObj.x
, то впоследствии получатель повысит исключение, если попытается получить доступ к x
позже. Это означает, что hasattr
вернет False
при проверке, является ли x
существующим атрибутом, и поэтому мой __getattr__
не позволит вам его воссоздать. Если вам действительно нужно иметь возможность удалять (и воссоздавать) определенные атрибуты, вам понадобится более сложная реализация __setattr__
(она может проверять класс для свойства с нужным именем, а не просто полагаться на hasattr
).