У меня следующая проблема:
Мне нужно написать декоратор, который мог бы обнаружить ситуацию, когда он используется вокруг метода и обычной функции.
Итак, давайте рассмотрим следующий код:
def somedecorator(fn):
print "decorating function:", fn
print "function class:", fn.__class__
return fn
@somedecorator
def regular_func():
print "I'm a regular function"
class SomeClass(object):
@somedecorator
def class_method(self):
print "I'm a class method"
Вывод гласит:
decorating function: <function regular_func at 0x181d398>
function class: <type 'function'>
decorating function: <function class_method at 0x181d410>
function class: <type 'function'>
Однако пишу:
print regular_func
print SomeClass.class_method
print SomeClass().class_method
Производит продукцию:
<function regular_func at 0x181d398>
<unbound method SomeClass.class_method>
<bound method SomeClass.class_method of <__main__.SomeClass object at 0x16d9e50>>
Так что (как это не удивительно) оказывается, что декораторы применяются к функциям до того, как они превращаются в методы.
Вопрос: Что бы вы предложили отличить эти два приложения от точки зрения декоратора?
EDIT
Для любопытных - мне нужно описанное различие из-за травления. Я действительно не хочу вдаваться в подробности об этом.