Поскольку, как говорит @Jonathan, дескрипторы (включая свойства) предназначены для каждого класса, а не для каждого экземпляра, единственный способ получить разные дескрипторы для каждого экземпляра состоит в том, чтобы каждый экземпляр индивидуализировал свой собственный класс. Это довольно поверхностно и просто с точки зрения метапрограммирования; -) ...:
class Individualistic(object_or_whatever_bases):
def __init__(self, whatever_args):
self.__class__ = type('GottaBeMe', (self.__class__, object), {})
# keep rocking...!-)
Я также добавляю object
явно, потому что это необходимо (в Python 2.*
, и вы говорите, что именно это вы используете !!!), чтобы сделать классы нового типа. Никогда больше не используйте устаревшие классы, они ведут себя неправильно по отношению к свойствам и многому другому (кроме того, для обратной совместимости они не могут - в Python 3 устаревшие классы наконец-то уничтожены, поэтому КАЖДЫЙ класс - новый стиль без требование явно наследовать от объекта больше!).
Теперь любой дескриптор, помещенный в self.__class__.__dict__
, будет влиять только на этот один экземпляр, а не на другой. Есть некоторые накладные расходы (у каждого GottaBeMe
класса и, следовательно, у каждого экземпляра есть свой __dict__
и т. Д.), Но ничего слишком страшного.
Теперь все, что необходимо для удовлетворения первоначального запроса, - это изменить:
class WidthVariable:
def __init__(self, object)
object.width = property(self.get_width)
(также разумно переименовывает аргумент object
, чтобы не допускать растоптания встроенного класса и придания классу нового стиля, потому что вы ВСЕГДА должны создавать КАЖДЫЙ класс в новом стиле ;-), чтобы:
class WidthVariable(object):
def __init__(self, obj)
obj.__class__.width = property(self.get_width)
Ничего особенного, как вы можете видеть! -)