Чисто любопытство вопрос:Переопределение списка встроенных команд динамически в области видимости класса
class Li(list): pass
m, n= Li([1]), Li([2])
def r(*args, **kwargs): raise Exception('hop')
setattr(m, '__iadd__', r)
m += n
print m # [1, 2]
setattr(Li, '__iadd__', r)
m += n
Выход:
[1, 2]
Traceback (most recent call last):
File "C:\...\test_override.py", line 8, in <module>
m+=n
File "C:\...\test_override.py", line 3, in r
def r(*args, **kwargs): raise Exception('hop')
Exception: hop
Если я использую setattr(m, 'append', r)
тогда m.append(2)
подведет. Итак, __iadd__
вызывает объект класса?
Также можно использовать settattr
из класса scope? Наивная попытка, как в:
def r(*args, **kwargs): raise Exception('hop')
class Li(list):
for s in {'__iadd__','append'}: setattr(Li, s, r)
терпит неудачу с NameError: имя «Ли» не определен
Не могли бы вы разъяснить, что вы на самом деле спрашиваете? Если вы хотите исправлять встроенные модули, вам понадобится что-то вроде https://github.com/clarete/forbiddenfruit – jonrsharpe
. Имена специальных методов [искали] (https://docs.python.org/2/reference/ datamodel.html # special-method-lookup-for-new-style-classes) в типе, а не в словаре экземпляров. Вот почему это связано с 'append', но не с' __iadd__'. – mata
@mata: aha - не могли бы вы объяснить ответ (с таким количеством ссылок, сколько хотите) - также (и это сложная часть), как я могу это сделать из класса? Это динамически вызывает 'setattr' раз и навсегда при инициализации класса? Забудьте о прецеденте - я спрашиваю, возможно ли это –