Мне нужно украсить метод объекта. Это должно происходить во время выполнения, потому что декораторы, применяемые к объекту, зависят от аргументов, которые пользователь дал при вызове программы (аргументы, предоставляемые с argv), поэтому один и тот же объект может быть декорирован 3 раза, 2 раза или не декорирован в все.
Вот некоторый контекст, программа решает головоломки, главное поведение - найти решение головоломки автоматически, то есть автоматически, без участия пользователя. И вот тут-то и начинает играть декорация, одна из вещей, которую я хочу сделать, это нарисовать график того, что произошло во время исполнения, но я хочу делать это только тогда, когда используется флаг --draw-graph
.
Вот что я пробовал:
class GraphDecorator(object):
def __init__(self, wrappee):
self.wrappee = wrappee
def method(self):
# do my stuff here
self.wrappee.method()
# do more of stuff here
def __getattr__(self,attr):
return getattr(self.wrappee,attr)
И почему это НЕ работает:
Это не сработало из-за способа, которым я создавал приложение, когда вызывался метод, который не существовал в моем классе Decorator, он возвращался к реализации декорированного класса, проблема в том, что приложение всегда начинало вызывать метод run
это не нужно было украшать, поэтому использовался неокрашенный отступ, а внутри недекорированной формы он всегда вызывал недекорированные методы, мне нужно было заменить метод из объекта, а не проксировать его :
# method responsible to replace the undecorated form by the decorated one
def graphDecorator(obj):
old_method = obj.method
def method(self):
# do my stuff here
old_method()
# do more of my stuff
setattr(obj,'method',method) # replace with the decorated form
А вот моя проблема: оформленная форма не получает self
, когда она вызывается, что приводит к ошибке TypeError из-за неправильного числа аргументов.