Рассмотрим два следующих определения класса, в которых для выполнения дополнительных проверок перед присвоением значения атрибуту (например, отслеживание измененных переменных, проверка на допустимость и т. Д.) В первом я переопределяю * 1001. * метод, а во втором я использую свойства.
class A(object):
def __init__(self, x):
self.x = x
def __setattr__(self, name, value):
# do something
self.__dict__[name] = value
class B(object):
def __init__(self, x):
self.x = x
@property
def x(self):
return self.x
@x.setter
def x(self, v):
# do something
self.x = v
Мне кажется, они ведут себя одинаково.
Есть ли разница между этими двумя? Какой из них предпочтительнее и почему?