LINUX.ORG.RU

Декоратор метода - метод [python]

 


0

0

Я хочу сделать, чтобы декоратор метода был методом класса.

Не допускаю ли я какой-нибудь грубой ошибки вот таким кодом:

class Sequences(list):
    ...

    def sendUpdate(meth):
        def wrapped(self, *args, **kwargs):
            result=meth(self, *args, **kwargs)
            pubsub.Publisher().sendMessage('SEQUENCES CHANGED', self)
            return result

    @sendUpdate
    def addSequence(self, sequence):
        self.append(sequence)
★★★★

Ответ на: комментарий от tailgunner

Да не, вроде всё работает.

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

Davidov ★★★★
() автор топика

Не знаю, насколько груба ошибка в твоем случае. sendUpdate выглядит очень странно для читателя: вроде обычный метод (не @staticmethod), но self не принимает и при вызове через экземпляр дает ошибку.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от Davidov

> если просто добавить staticmethod, то оно работать не будет.

А зачем этому декоратору быть методом? Что ему мешает быть глобальной функцией? Тяжелое жабское прошлое? :)

Да и вообще, декораторы принято делать максимально прозрачными, например, с помощю этого: http://www.phyast.pitt.edu/~micheles/python/documentation.html

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

Жабского прошлого, к счастью, нет.

Просто глобальные функции - это хорошо, когда они по смыслу глобальные.

А здесь совершенно очевидно, что за пределами этого класса декоратор смысла не имеет.

В данном конкретном случае можно, конечно, сделать

def sendUpdate(meth, message):

Но всё равно интересно, можно ли сделать его членом класса.

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

Метод класса в python не совсем метод класса в смысле c++,java ибо он не принимает неявного this. Да и глобальный функция будет только в пределах текущего модуля.

krum
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.