Обычно для этого нет причин, но в некоторых случаях это может быть:
- быстрее (потому что быстрый доступ к локальным переменным)
- более легко читаемый (потому что он короче)
Скорость, вероятно, является более важным фактором здесь. Доступ к переменным-членам включает различные механизмы (см. __getattr__
, __getattribute__
, __dict__
, дескрипторы ), которые занимают некоторое время Разрешить. Кроме того, метод получения переменной может сделать что-то еще более дорогое.
С другой стороны, локальные переменные в CPython оптимизируются во время компиляции, поэтому фактически нет поиска для переменной с именем 'obj_foo'
в __dict__
, но вместо этого интерпретатор просто выбирает первую локальную переменную, потому что он знает, что obj_foo
является первой локальной переменной без необходимости искать имя.
Таким образом, если переменная-член используется много раз в одной и той же функции, и профилирование показывает, что для доступа к этой переменной-члену требуется значительное время, может быть полезно использовать вместо нее локальную переменную.
Обычно это не имеет большого значения, но вот пример, демонстрирующий идею:
class A:
def __init__(self,x):
self.x=x
def f(self):
for i in range(100):
self.x()
class B:
def __init__(self,x):
self.x=x
def f(self):
x=self.x
for i in range(100):
x()
Время почти такое же, но есть некоторая разница:
>>> timeit.timeit('a.f()', setup='a=A(lambda:None)', globals=locals())
13.119033042000638
>>>
>>> timeit.timeit('b.f()', setup='b=B(lambda:None)', globals=locals())
10.219889547632562
ИМХО, в этом случае разница едва достаточна, чтобы оправдать добавление одной строки кода.