В Python я хочу кое-что сделать, похожую на встроенную property
, которую я не знаю, как это сделать.
Я называю этот класс LazilyEvaluatedConstantProperty
.Он предназначен для свойств, которые должны рассчитываться только один раз и не изменяться, но они должны создаваться лениво, а не при создании объекта, для производительности.
Вот использование:
class MyObject(object):
# ... Regular definitions here
def _get_personality(self):
# Time consuming process that creates a personality for this object.
print('Calculating personality...')
time.sleep(5)
return 'Nice person'
personality = LazilyEvaluatedConstantProperty(_get_personality)
Вы можете видеть, что использование похоже на property
, за исключением того, что есть только геттер, и нет установщика или удалителя.
Предполагается, что при первом доступе к my_object.personality
метод _get_personality
вызываться, и тогда результат будет кэширован, и _get_personality
никогда больше не будет вызываться для этого объекта.
В чем моя проблема с реализацией этого?Я хочу сделать что-то немного хитрое для улучшения производительности: я хочу, чтобы после первого доступа и _get_personality
вызова personality
стал атрибутом данных объекта, поэтому поиск будет быстрее при последующих вызовах.Но я не знаю, как это возможно, поскольку у меня нет ссылки на объект.
У кого-нибудь есть идея?