Скорость @property в Python
Я пытаюсь понять полезность декоратора @property в Python. В частности, я установил класс, используя такие свойства:
class A(object):
def __init__(self, x):
self._x = x
@property
def x(self):
return self._x
@x.setter
def x(self, new_x):
self._x = new_x
И я также установил класс без свойств, обеспечивающих ту же функциональность:
class B(object):
def __init__(self, x):
self._x = x
Я создаю экземпляр каждого:
a = A(10)
b = B(10)
Запуск%timeit в iPython дает следующие результаты
%timeit a.x
%timeit b._x
1000000 циклов, лучшее из 3: 213 нс на цикл
10000000 циклов, лучшее из 3: 67,9 нс на цикл
%timeit a.x = 15
%timeit b._x = 15
1000000 циклов, лучшее из 3: 257 нс на цикл
10000000 циклов, лучшее из 3: 89,7 нс на цикл
Очевидно, что декораторы @property и @setter уступают, если вы собираетесь разговаривать с объектом со значительной частотой. Мой вопрос, просто зачем его использовать? Мне было бы интересно услышать любые варианты использования этих декораторов, которые могут быть у людей. Благодарю.
2 ответа
Ответ прост: вы не используете property
s для основных атрибутов. Они полезны для атрибутов, которые требуют дополнительной логики при сохранении или получении. Например, атрибуты со значениями, полученными из других атрибутов или атрибутов, которые требуют проверки ошибок или другой специализированной фильтрации. С помощью property
s позволяет вам использовать общий шаблон "сеттер / геттер", распространенный в других языках, в стиле "а-ля карт", отказавшись от моды, вместо того, чтобы форсировать подробный шаблон.
Если атрибут настолько прост, не используйте property
, Тебе это не нужно. property
есть ли случаи, когда для получения и установки атрибута нужно делать больше, например, если требуется вычисление:
@property
def area(self):
return math.pi * self.radius**2
Они особенно полезны, когда то, что раньше было простым __dict__
поиск внезапно должен выполнить дополнительную работу. Вы можете переключиться на свойство без необходимости добавлять скобки вызова метода на каждом сайте вызова.