Уведомления

Группа в Telegram: @pythonsu

#1 Март 29, 2011 18:58:46

Schubbe
От:
Зарегистрирован: 2010-09-13
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Ленивая инициализация

Очень хотелось бы получить возможность ленивой инициализации для любого атрибута класса.
Подскажите, пожалуйста, простое и эффективное решение.



Отредактировано (Март 29, 2011 18:59:35)

Офлайн

#2 Март 29, 2011 19:36:58

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Ленивая инициализация

class A():
def __init__(self):
self.foo

A1=A()
A1.foo='init'



Офлайн

#3 Март 30, 2011 12:05:55

Schubbe
От:
Зарегистрирован: 2010-09-13
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Ленивая инициализация

На этот код мой Python 2.6 выдает ошибку при попытке создания экземпляра класса: AttributeError: A instance has no attribute ‘foo’.

Я имел в виду ленивую инициализацию в духе Smalltalk:

value
^value ifNil: [value := self valueCalculation]
при первом вызове вычислит значение value и вернет его, а для последующих вызовов вернет уже рассчитанное значение value, без повторных вычислений. Как подобное реализовать в Python'е? Дело в том, что при обращении к несуществующему атрибуту класса (к его getter'у) Smalltalk возвращает Nil (аналог None), а Python генерирует исключение.



Отредактировано (Март 30, 2011 16:44:09)

Офлайн

#4 Март 30, 2011 12:19:20

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Ленивая инициализация

http://www.toofishes.net/blog/python-cached-property-decorator/ - тут реализован декоратор, который все делает



Отредактировано (Март 30, 2011 12:19:30)

Офлайн

#5 Март 30, 2011 12:21:47

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Ленивая инициализация

что-нибудь типа такого:

class LazyInit(object):
def __init__(self):
self._foo = None
@property
def foo(self):
if not self._foo:
self._foo = "init"
return self._foo



Офлайн

#6 Март 30, 2011 16:49:03

Schubbe
От:
Зарегистрирован: 2010-09-13
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Ленивая инициализация

truporez, суть верна, но как-то лень везде таскать такую ленивую инициализацию:)
regall, спасибо за дельный декоратор - то что доктор прописал!



Отредактировано (Март 30, 2011 16:54:42)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version