Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/104: Рейтинг темы: голосов - 104, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 17

Декораторы, счетчик вызова

11.04.2013, 00:34. Показов 21899. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
не работает счетчик вызова, ошибка "функция не имеет атрибута" помогите исправить
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def benchmark(func):
    """
    Декоратор, выводящий время, которое заняло
    выполнение декорируемой функции.
    """
    import time
    def wrapper(*args, **kwargs):
        t = time.clock()
        res = func(*args, **kwargs)
        print func.__name__, time.clock() - t
        return res
    return wrapper
 
 
def logging(func):
    """
    Декоратор, логирующий работу кода.
    (хорошо, он просто выводит вызовы, но тут могло быть и логирование!)
    """
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        print func.__name__, args, kwargs
        return res
    return wrapper
 
 
def counter(func):
    """
    Декоратор, считающий и выводящий количество вызовов
    декорируемой функции.
    """
    counter.count[func.__name__] = 0
    def wrapper(*args, **kwargs):
        counter.count[func.__name__] += 1
        res = func(*args, **kwargs)
        print "{0} была вызвана: {1}x".format(func.__name__, counter.count[func.__name__])
        return res
    return wrapper
 
 
@benchmark
@logging
@counter
def reverse_string(string):
    return str(reversed(string))
 
print reverse_string("А роза упала на лапу Азора")
print reverse_string("A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal: Panama!")
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2013, 00:34
Ответы с готовыми решениями:

Работа с функциями. Оператор вызова. Декораторы
написать декоратор wrap_validate, не принимающий никаких параметров его задача – проверить, что функция, которую он задекорировал,...

Создать класс Автомобиль и счетчик вызова метода для изменения скорости
Создать класс Автомобиль и счетчик вызова метода для изменения скорости.

Создать класс Автомобиль и счетчик вызова метода для изменения скорости
Создать класс Автомобиль и счетчик вызова метода для изменения скорости.

2
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
11.04.2013, 09:13
Так у функций, вроде бы, и правда не может быть артибутов.
Пиши class с __call__ .
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.04.2013, 16:31
Цитата Сообщение от dondublon Посмотреть сообщение
Так у функций, вроде бы, и правда не может быть артибутов.
Ну конечно же могут. Функции — это экземпляры класса function, и, как любые полноценные объекты, они содержат атрибуты. К примеру, в том исходнике активно использовался атрибут __name__.

flas, проблема состояла в том, что ты пытался обратиться к атрибуту функции, который в тот момент не существовал. Поэтому его нужно сначала определить:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def counter(func):
    """
    Декоратор, считающий и выводящий количество вызовов
    декорируемой функции.
    """
 
    if not hasattr(counter, 'count'):
        counter.count = {}
 
    counter.count[func.__name__] = 0
    def wrapper(*args, **kwargs):
        counter.count[func.__name__] += 1
        res = func(*args, **kwargs)
        print "{0} была вызвана: {1}x".format(func.__name__, counter.count[func.__name__])
        return res
    return wrapper
Но мне кажется, что удачней будет хранить число вызовов функции не как атрибут декоратора, а как атрибут самой функции:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def counter(func):
    """
    Декоратор, считающий и выводящий количество вызовов
    декорируемой функции.
    """
 
    func.__invocation_count__ = 0
 
    def wrapper(*args, **kwargs):
        func.__invocation_count__ += 1
        res = func(*args, **kwargs)
        print "{0} была вызвана: {1}x".format(func.__name__, func.__invocation_count__)
        return res
    return wrapper
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2013, 16:31
Помогаю со студенческими работами здесь

нужно чтобы функция располагалась до ее вызова, после ее вызова и в другом файле. Как это сделать?
#include <iostream> #include <conio.h> using namespace std; int n, *c; void fun(int a, int b) { for (int i = 0; i <...

После вызова печати, я хочу попасть на ту форму что вызывала, и на то поле где была до вызова
Например я в форме на каком-то поле Вызываю с формы отчет, потом закрываю отчет, и моя форма видна, но не активна, на ней нет фокуса....

Декораторы
здравствуйте заинтересовал сабж, нашёл в сети @decorator_function def hello_world(): print('Hello world!') hello_world() ...

Декораторы в C++
Как правильно написать функцию, которая принимает другую случайную функцию, возможно что-то делает, вызывает принятую функцию, возможно...

Декораторы
Добрый день! Не получается сделать задачу. Вот условие: На вход программы поступает строка из целых чисел, записанных через пробел....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru