Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 21, 2012 00:05:04

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Декоратор для методов классов не отображает атрибут.

По М.Лутцу пример.
Смысл примера-показать как обарачивать методы классов.
decorators.py:

class tracer(object):
    def __init__(self, func):
        self.calls=0
        self.func=func
    def __call__(self, *args, **kwargs):
        self.calls+=1
        print 'call %s to %s' % (self.calls, self.func.__name__)
        self.func(*args, **kwargs)
    def __get__(self, instance, owner):
        def wraper(*args, **kwargs):
            print self
            print instance
            print owner
            print instance.name
            return self(instance, *args, **kwargs)
        return wraper
class Person():
    def __init__(self, name, pay):
        self.name = name
        self.pay = pay
    @tracer
    def giveRaise(self, percent):
        self.pay *= 1.0 + percent
    @tracer
    def lastName(self):
        return self.name.split()[-1]
if __name__=='__main__':
    bob = Person('Bob Smith', 50000)
    sue = Person('Sue Jones', 100000)
    print bob.lastName()
    print sue.lastName()

Вот результат работы модуля:
<__main__.tracer object at 0x00000000021CFCC0>
<__main__.Person instance at 0x00000000021D2A88>
__main__.Person
Bob Smith
call 1 to lastName
None #вот тут пытаюсь проследить чего не так пошло
<__main__.tracer object at 0x00000000021CFCC0>
<__main__.Person instance at 0x00000000021D2AC8>
__main__.Person
Sue Jones
call 2 to lastName
None #и тут соответственно

подскажите где алгоритм некорректно работает??
Всё по книжечке…

Офлайн

#2 Авг. 21, 2012 02:07:13

mindless
Зарегистрирован: 2012-04-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Декоратор для методов классов не отображает атрибут.

File "<>", line 8
def __call__(self, *args, **kwargs):
self.calls+=1
print 'call %s to %s' % (self.calls, self.func.__name__)
self.func(*args, **kwargs)
^
Nirabotaet: return stmt is missing

Отредактировано mindless (Авг. 21, 2012 02:07:53)

Офлайн

#3 Авг. 21, 2012 05:18:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Декоратор для методов классов не отображает атрибут.

Возможно, ошибка в том, что __call__ у Вас ничего не возвращает.

return self(instance, *args, **kwargs)
то есть тут должен вызваться __call__ и вернуться его результат, но т.к. он ничего не возвращает, то wraper вернет None.

Это поверхностный взгляд на код.



Отредактировано FishHook (Авг. 21, 2012 05:19:32)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version