Объекты дескриптора property
должны жить в классе , , а не в экземпляре , чтобы получить желаемый эффект. Если вы не хотите изменять существующий класс, чтобы избежать изменения поведения других экземпляров, вам необходимо создать «класс для каждого экземпляра», например ::
def addprop(inst, name, method):
cls = type(inst)
if not hasattr(cls, '__perinstance'):
cls = type(cls.__name__, (cls,), {})
cls.__perinstance = True
inst.__class__ = cls
setattr(cls, name, property(method))
Я отмечаю эти специальные классы для каждого экземпляра атрибутом, чтобы избежать ненужного создания нескольких, если вы выполняете несколько вызовов addprop
для одного экземпляра.
Обратите внимание, что, как и для других случаев использования property
, вам необходимо, чтобы класс в игре был новый стиль (обычно получаемый прямым или косвенным наследованием от object
), не древний унаследованный стиль (удален в Python 3), который по умолчанию назначен классу без оснований.