Форум сайта python.su
Как заставить чтобы декоратор мог работать и в своём классе и в дочернем…
Как поняла - чтобы в дочернем работал - надо его классметодом сделать… но тогда отказывается в собственном классе работать, или я его не правильно вызываю…
import logging module_logger = logging.getLogger('testlog') class DecorTest(object): def __init__(self): print 'init' self.a=5 self.b=8 self.str='1234567890qwertyuikdfgh' self.logger = logging.getLogger('testlog.DecorTest') self.logger.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) self.logger.addHandler(ch) def printer(self): print self.a @classmethod def deco(cls, fn): def wrapped(self, *args, **kwargs): self.logger.debug('start deco %s %s'%(self.__class__, fn.__name__)) self.printer() fn(self, *args, **kwargs) self.logger.debug('end deco %s'%(self.str)) return wrapped @deco #А вот тут - не хочет работать, пробовала и со скобочками, и @DecorTest.deco.... def myfunc(self): print '%s +%s = %s'%(self.a ,self.b, self.a+self.b) class SubDeco(DecorTest): def __init__(self): DecorTest.__init__(self) @DecorTest.deco #Тут нормально вызывается и работает def callfunc(self): print 'my SubDeco addition' def subcall(self): self.myfunc() def main(): DT=SubDeco() DT.callfunc() DT.subcall() if __name__ == '__main__': main()
Отредактировано Solly (Окт. 21, 2013 00:53:17)
Офлайн
и еще в догонку - а можно ли и как декоратор, задекорированный как классметод обернуть еще одним декоратором - внутри базового класса?
Отредактировано Solly (Окт. 21, 2013 01:16:42)
Офлайн
у тебя в методе класса используется self, тогда как никакого self туда не поступает
(это не относится к декораторам)
сделай сначала что-нибудь попроще, выделив только то, что нужно сделать; тогда, может, и получится
а то тут понамешано, а цель не ясна
Sollyсначала сделай простой пример, где декоратор правильно работает в своём классе
Как заставить чтобы декоратор мог работать и в своём классе и в дочернем…
Отредактировано py.user.next (Окт. 21, 2013 05:04:01)
Офлайн
по отдельности все нормально работает
- у тебя в методе класса используется self, тогда как никакого self туда не поступает
— ну а как его туда запихнуть?
Офлайн
классметод не нужен же
import logging module_logger = logging.getLogger('testlog') def deco(fn): def wrapped(self, *args, **kwargs): self.logger.debug('start deco %s %s'%(self.__class__, fn.__name__)) self.printer() fn(self, *args, **kwargs) self.logger.debug('end deco %s'%(self.str)) return wrapped class DecorTest(object): def __init__(self): print 'init' self.a=5 self.b=8 self.str='1234567890qwertyuikdfgh' self.logger = logging.getLogger('testlog.DecorTest') self.logger.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) self.logger.addHandler(ch) def printer(self): print self.a @deco #А вот тут - не хочет работать, пробовала и со скобочками, и @DecorTest.deco.... def myfunc(self): print '%s +%s = %s'%(self.a ,self.b, self.a+self.b) class SubDeco(DecorTest): def __init__(self): DecorTest.__init__(self) @deco #@DecorTest.deco #Тут нормально вызывается и работает def callfunc(self): print 'my SubDeco addition' def subcall(self): self.myfunc() def main(): DT=SubDeco() DT.callfunc() DT.subcall() if __name__ == '__main__': main()
Sollyда, только @classmethod должен быть последним декоратором, там какое-то связывание происходит
и еще в догонку - а можно ли и как декоратор, задекорированный как классметод обернуть еще одним декоратором - внутри базового класса?
Офлайн
sergeek
Спасибо
Офлайн