2013-03-04 2 views
4

У меня есть класс, определяемый следующим образом:Python декоратор с аргументами и класса получающего доступ, например

class SomeViewController(BaseViewController): 
    @requires('id', 'param1', 'param2') 
    @ajaxGet 
    def create(self): 
     #do something here 

Можно ли написать функцию декоратора, что:

  1. принимает список аргументов, и, возможно, kwargs и
  2. Доступ к экземпляру класса, в котором определяется его декорирование?

Так что для @ajaxGet декоратора, есть атрибут self называется type, который содержит значение, мне нужно проверить.

Thanks

+1

Зависит, что вы имеете в виду. Сам декоратор не может иметь доступ к 'self', так как украшение происходит во время определения класса, до того, как будут существовать какие-либо экземпляры. Но завернутая функция, которая является результатом декоратора, будет знать экземпляр при его вызове. Можете ли вы привести пример того, чего вы хотите достичь? – BrenBarn

+0

Итак, когда я вызываю 'create' на' SomeViewController', у украшенного метода (ов) есть доступ к 'self' (который передается в' create', поэтому использование этого объекта является возможностью), а также может принимать аргументы для выполнения проверок против других атрибутов на 'self' –

ответ

9

Да. На самом деле, в том смысле, что вы, похоже, имеете в виду, на самом деле нет способа написать декоратор, который не имеет, есть доступ к self. Декорированная функция обертывает исходную функцию, поэтому она должна принимать хотя бы аргументы, которые принимает эта функция (или некоторые аргументы, из которых они могут быть получены), иначе она не сможет передать правильные аргументы базовой функции.

Там нет ничего особенного, что вам нужно сделать, чтобы сделать это, просто написать обычный декоратор:

def deco(func): 
    def wrapper(self, *args, **kwargs): 
     print "I am the decorator, I know that self is", self, "and I can do whatever I want with it!" 
     print "I also got other args:", args, kwargs 
     func(self) 
    return wrapper 

class Foo(object): 
    @deco 
    def meth(self): 
     print "I am the method, my self is", self 

Тогда вы можете просто использовать:

>>> f = Foo() 
>>> f.meth() 
I am the decorator, I know that self is <__main__.Foo object at 0x0000000002BCBE80> and I can do whatever I want with it! 
I also got other args:() {} 
I am the method, my self is <__main__.Foo object at 0x0000000002BCBE80> 
>>> f.meth('blah', stuff='crud') 
I am the decorator, I know that self is <__main__.Foo object at 0x0000000002BCBE80> and I can do whatever I want with it! 
I also got other args: (u'blah',) {'stuff': u'crud'} 
I am the method, my self is <__main__.Foo object at 0x0000000002BCBE80> 
+0

Спасибо за это. Есть ли способ заставить декоратора принимать аргументы для проверки? Если вы ответите, я отвечу на ваш ответ. –

+0

Что значит «принимать аргументы для проверки»? – BrenBarn

+0

Декоратор должен принять некоторые аргументы, чтобы затем быть проверен в функции декоратора против 'self'. Я работал, хотя функция декоратора должна быть завернута в другую функцию. –

Смежные вопросы