Да. На самом деле, в том смысле, что вы, похоже, имеете в виду, на самом деле нет способа написать декоратор, который не имеет, есть доступ к 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>
Зависит, что вы имеете в виду. Сам декоратор не может иметь доступ к 'self', так как украшение происходит во время определения класса, до того, как будут существовать какие-либо экземпляры. Но завернутая функция, которая является результатом декоратора, будет знать экземпляр при его вызове. Можете ли вы привести пример того, чего вы хотите достичь? – BrenBarn
Итак, когда я вызываю 'create' на' SomeViewController', у украшенного метода (ов) есть доступ к 'self' (который передается в' create', поэтому использование этого объекта является возможностью), а также может принимать аргументы для выполнения проверок против других атрибутов на 'self' –