2016-02-23 2 views
3

С учетом объекта foo (к которому у меня есть доступ) класса A (к которому у меня нет доступа).Определить свойства для экземпляров объектов

foo имеет атрибут х, доступ к которой осуществляется много партий, которые также могут установить foo.x.

ли это как-то можно заменить foo.x с @property -как таким образом, что задания, как

foo.x = "bar" 

Воле от затем вызвать функцию, указанную мной? Если да, можно ли впоследствии удалить это свойство и снова заменить его чем-то вроде, например, foo.x = "not a property"?

Просьба учитывать: у меня нет доступа к классу, но только к объекту.

+0

Ну, у вас есть доступ к вызову, когда у вас есть объект: 'your_object .__ class__'. –

+0

@KlausD. Дело не в том, могу ли я получить доступ к классу, но на самом деле хочу. Я надеялся найти альтернативный путь здесь. –

ответ

4

Вы не можете поместить свойства в экземпляр, нет. Вам придется обезвредить класс или подклассировать его.

Обезьяны латание может потребовать от вас, чтобы сохранить исходный атрибут где-то на экземпляре по-прежнему, используя другое имя:

def getter(self): 
    try: 
     return self._x 
    except AttributeError: 
     # access the attribute on the instance directly. 
     try: 
      return self.__dict__['x'] 
     except KeyError: 
      raise AttributeError('x') 

def setter(self, value): 
    self._x = value 

foo._x = foo.x 
type(foo).x = property(getter, setter) 

Это устанавливает property объект на классе. Теперь все экземпляры этого класса будут иметь это свойство! Чтобы справиться с этим, getter выше возвращается к попытке получить исходное значение атрибута x из экземпляра __dict__, если нет атрибута _x. Это должно обеспечить, чтобы существующие экземпляры продолжали работать.

Удаление свойства так просто, как удалить его:

del type(foo).x 

Обратите внимание, что этот будет конфликт с класса атрибута (например, если type(foo).x является существующий объект).

Смежные вопросы