Как определить декораторы с несколькими аргументами в классе в 2.6 - PullRequest
2 голосов
/ 11 июня 2010

Как правило, не выполняйте OO-программирование на Python.Этот проект требует этого, и у меня немного проблем.Вот мой рабочий код для попытки выяснить, где произошла ошибка:

class trial(object):
    def output( func, x ):
        def ya( self, y ):
            return func( self, x ) + y
        return ya
    def f1( func ):
        return output( func, 1 )
    @f1
    def sum1( self, x ):
        return x

, который не компилируетсяЯ пытался добавить тег @staticmethod к функциям «output» и «f1», но безрезультатно.Обычно я сделал бы это

def output( func, x ):
    def ya( y ):
        return func( x ) + y
    return ya

def f1( func ):
    return output( func, 1 )

@f1
def sum1( x ):
    return x

, который работает.Итак, как мне это сделать в классе?

Ответы [ 3 ]

5 голосов
/ 11 июня 2010

Нет необходимости, чтобы ваши декораторы методов были частью класса:

def output(meth, x):
    def ya(self, y):
        return meth(self, x) + y
    return ya

def f1(meth):
    return output(meth, 1)

class trial(object):
    @f1
    def sum1( self, x ):
        return x

>>> trial().sum1(1)
2

Я склонен использовать meth вместо func в декораторах. Я знаю, что буду применять к методам, просто чтобы держать это прямо в моей голове.

0 голосов
/ 11 июня 2010

Попробуйте это уродливое решение

class trial(object):

    def __init__(self):
        #doing this instead of @ statement
        self.sum1 = self.f1(self.sum1)

    def output(self, func, x ):
        def ya(y):
            return func(x) + y
        return ya

    def f1(self, func):
        return self.output( func, 1 )


    def sum1(self, x ):
        return x

t = trial()

print t.sum1(5)
0 голосов
/ 11 июня 2010

Ни за что. Это неправильный дизайн. Следуй за Дзен Питона

Когда вы декорируете функцию, вызывающую декоратор с помощью @, она должна быть уже определена.

Сначала необходимо определить декоратор, а на втором шаге оформить функцию.

...