Дескрипторы (например, экземпляры типа property
) имеют смысл только тогда, когда они содержатся в объекте class , а не в объекте instance . Итак, вам нужно изменить класс, а не экземпляр, и (в Python 2.6 или выше) декоратор классов очень удобен для этой цели:
class Base(object):
def _lazy_eval(self, attr):
#Do complex stuff here
return attr
def lazyclass(cls):
for attr in cls._myattrs:
setattr(cls, attr, property(lambda self: self._lazy_eval(attr)))
return cls
@lazyclass
class Child(Base):
_myattrs = ['foo', 'bar']
Если вы застряли в Python 2.5 или более ранней версии, синтаксис декоратора не применяется к классам, но такой же эффект легко получить, просто с менее изящным синтаксисом - измените последние 3 строки на:
class Child(Base):
_myattrs = ['foo', 'bar']
Child = lazyclass(Child)
, которая имеет ту же семантику, что и синтаксис декоратора класса.