[Обновлено]: ответьте на вопрос ниже
У меня есть программа проверки, и одна цель состоит в том, чтобы логика в декораторе знала, является ли функция, которую она украшает, методом класса или обычной функцией. Это терпит неудачу странным образом. Ниже приведен код, запускаемый в Python 2.6:
def decorate(f):
print 'decorator thinks function is', f
return f
class Test(object):
@decorate
def test_call(self):
pass
if __name__ == '__main__':
Test().test_call()
print 'main thinks function is', Test().test_call
Затем при выполнении:
decorator thinks function is <function test_call at 0x10041cd70>
main thinks function is <bound method Test.test_call of <__main__.Test object at 0x100425a90>>
Любая подсказка о том, что идет не так,
[Ответить] Ответ Карла ниже почти идеален. У меня возникла проблема при использовании декоратора в методе, вызываемом подклассами. Я адаптировал его код, чтобы включить сравнение im_func для членов суперкласса:
ismethod = False
for item in inspect.getmro(type(args[0])):
for x in inspect.getmembers(item):
if 'im_func' in dir(x[1]):
ismethod = x[1].im_func == newf
if ismethod:
break
else:
continue
break