How to differentiate between method and function in a decorator?

前端 未结 4 1074
感情败类
感情败类 2021-02-06 02:38

I want to write a decorator that acts differently depending on whether it is applied to a function or to a method.

def some_decorator(func):
    if the_magic_hap         


        
4条回答
  •  孤街浪徒
    2021-02-06 02:58

    You just need to check to see if the function being decorated has an im_func attribute. If it does, then it is a method. If it doesn't then it is a function.

    Note that the code sample below does the detection at call time but you can do it at decoration time as well. Just move the hasattr check to the outer decorator generator.

    Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
    [GCC 4.4.1] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> def deco(f):
    ...   def _wrapper(*args, **kwargs):
    ...     if hasattr(f, 'im_func'):
    ...       print 'method'
    ...     else:
    ...       print 'function'
    ...   return _wrapper
    ... 
    >>> deco(lambda x: None)()
    function
    >>> def f(x):
    ...   return x + 5
    ... 
    >>> deco(f)()
    function
    >>> class A:
    ...   def f(self, x):
    ...     return x + 5
    ... 
    >>> a = A()
    >>> deco(a.f)()
    method
    >>> deco(A.f)()
    method
    >>> 
    

    Edit

    Oh snap! And I get it totally wrong. I so should have read Alex's post more thoroughly.

    >>> class B:
    ...   @deco
    ...   def f(self, x):
    ...     return x +5
    ... 
    >>> b = B()
    >>> b.f()
    function
    

提交回复
热议问题