Найти - Пользователи
Полная версия: Ленивая инициализация
Начало » Python для новичков » Ленивая инициализация
1
Schubbe
Очень хотелось бы получить возможность ленивой инициализации для любого атрибута класса.
Подскажите, пожалуйста, простое и эффективное решение.
guranvir
class A():
def __init__(self):
self.foo

A1=A()
A1.foo='init'
Schubbe
На этот код мой 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 генерирует исключение.
regall
http://www.toofishes.net/blog/python-cached-property-decorator/ - тут реализован декоратор, который все делает
truporez
что-нибудь типа такого:

class LazyInit(object):
def __init__(self):
self._foo = None
@property
def foo(self):
if not self._foo:
self._foo = "init"
return self._foo
Schubbe
truporez, суть верна, но как-то лень везде таскать такую ленивую инициализацию:)
regall, спасибо за дельный декоратор - то что доктор прописал!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB