2016-05-12 5 views
0

Допустит, один хочет добавить назначения элемента к экземпляру класса из внешней библиотеки:Python присваивания элемента патча

# defined outside our code base 
class WeDoNotWantToDeriveThis(object): pass 


inst = WeDoNotWantToDeriveThis() 
def set_item_func(self, idx, val): print("hi there") 
import types 
# try to patch item setter 
inst.__setitem__ = types.MethodType(set_item_func, inst) 
assert hasattr(inst, '__setitem__') 
print(type(inst.__setitem__)) # prints "instancemethod" 
# try to perform item assignment on inst 
inst[0] = None # raises 'object does not support item assignment' 

Вопрос заключается в том, как сделать это правильно. Может быть, 'setitem' не просматривается на экземпляре, но на самом классе, чтобы проверить, поддерживает ли объект назначение элемента?

Согласно документации, реализации SetItem метод должен быть достаточно: https://docs.python.org/3/reference/datamodel.html#object.setitem

+0

попробовать реализовать '__getitem__' вместо этого. –

+1

Почему бы не подкласс, а не перехват обезьян? – jonrsharpe

+0

Потому что для этого потребуется слишком много изменений кода. На данный момент это просто обходное решение. – marscher

ответ

1

Вы должны установить метод экземпляра на классе:

>>> WeDoNotWantToDeriveThis.__setitem__ = types.MethodType(set_item_func, None, WeDoNotWantToDeriveThis) 
>>> inst[0] = None 
hi there 
>>> 
+0

Мне действительно нужно исправить экземпляр (если это возможно), потому что я не хочу вводить побочные эффекты для других пользователей этой конкретной библиотеки. – marscher

+1

Не может быть никаких побочных эффектов, поскольку назначение предметов используется только вами. Или вы переопределяете назначение элемента по умолчанию? –

+0

Ваш код поднимается на Python3: TypeError: метод ожидал 2 аргумента, получил 3 – marscher

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

  • Нет связанных вопросов^_^