У меня есть класс, где мне нужен доступ к вычисленному значению, которое может быть рассчитано только для каждого подкласса. Это вычисление не из дешевых, и поскольку существует множество экземпляров подклассов, я хочу вычислить это значение только один раз для каждого подкласса.pythonic способ вычисления значения для объекта класса только один раз
я могу думать о двух решения, которые я не очень нравится:
Либо родительский класс будет иметь @classmethod
start()
, который будет вычислять значения. , это заставляет меня определить точное местоположение первого экземпляра каждого класса, поэтому я выбрал этот вариант.
или этот код:
class A(object):
@classmethod
def _set_cls_attribute(cls):
if hasattr(cls, 'big_attr'):
return
cls.big_attr = heavy_func(cls.VAL)
def __init__(self):
self._set_cls_attribute()
class B(A):
VAL = 'b'
class C(A):
VAL = 'c'
for _ in range(large_number):
b = B()
c = C()
Я не люблю использовать hasattr
хотя ... Есть ли что-нибудь лучше?
Метаклассы к спасению? – NPE
Ваш последний выглядит хорошо. 'hasattr' в порядке. – katrielalex
ваш код в порядке. Я бы пропустил hasattr и попытался поймать AttributeError вместо этого, то есть более путинский. «Проще просить прощения, чем разрешение» http://stackoverflow.com/questions/6092992/why-is-it-easier-to-ask-forgiveness-than-permission-in-python-but-not-in-java – theAlse