Python:decoration _调用_和普通函数是否使用相同的decorator?

Python:decoration _调用_和普通函数是否使用相同的decorator?,python,decorator,Python,Decorator,在Python 2.6-2.7中,是否可以为以下任务使用相同的装饰器: class ComplextCallableObject(object): @wrap_me def __call__(self, a1, a2): pass @wrap_me def simple_function(a1, a2): pass ComplextCallableObject.\uu调用和simple\u函数具有相同的参数,但是\uu调用对于第一个参数也具有self。

在Python 2.6-2.7中,是否可以为以下任务使用相同的装饰器:

class ComplextCallableObject(object):
    @wrap_me
    def __call__(self, a1, a2):
        pass

@wrap_me
def simple_function(a1, a2):
    pass
ComplextCallableObject.\uu调用
simple\u函数
具有相同的参数,但是
\uu调用
对于第一个参数也具有
self
。在
wrap\u me
decorator中,我需要对正在包装的函数args进行访问

def wrap_me(*args):
    a1, a2 = args if len(args) == 2 else args[1:]
    ...
当然,如果类方法上也调用了
wrap_me
,则需要修改返回的函数以获取
self
参数


顺便说一句,假设您没有在正在装饰的函数中实际使用
self
,那么它实际上应该是一个静态方法。

不幸的是,在定义时(本例中的类块),代码无法告诉函数将如何使用,除非通过命名约定。稍微修改一下您的示例:

class ComplextCallableObject(object):
    @wrap_me
    def __call__(self, a1, a2):
        pass #...

@wrap_me
def simple_function(tgt, a1, a2):
    pass

ComplextCallableObject.anInstanceMethod = simple_function
ComplextCallableObject.anClassMethod = classmethod(simple_function)
ComplextCallableObject.aStaticMethod = staticmethod(simple_function)
在这种情况下,
simple_function
正在实现一个包含一个目标和两个参数的函数,一个包含两个参数的实例方法,一个包含两个参数的类方法,以及一个包含一个目标和两个参数的静态方法。但是这些用法在函数定义之后才被绑定。
staticmethod
classmethod
都返回不同的对象类型,因此如果需要,您可以区分它们

如果确实要使用约定,可以检查函数的第一个参数名,查看它是否为
self

def wrap_me(fn):
    names = fn.func_code.co_varnames
    if names and names[0]=='self':
        print 'looks like an instance method'
    else: print 'looks like a function'
    return fn

这可能相当愚蠢,但也可能适用于最简单的情况:

In [1]: def wrap_me(func):
   ...:     def wrapped(*args):
   ...:         print 'arg1 is', args[-2]
   ...:         print 'arg2 is', args[-1]
   ...:         func(*args)
   ...:     return wrapped
   ...:
In [2]: class ComplexCallableObject(object):
   ...:     @wrap_me
   ...:     def __call__(self, a1, a2):
   ...:         print 'class object called'
   ...:
In [3]: @wrap_me
   ...: def simple_function(a1, a2):
   ...:     print 'function called'
   ...:
In [4]: simple_function('A', 'B')
arg1 is A
arg2 is B
function called
In [5]: o = ComplexCallableObject()
In [6]: o('A', 'B')
arg1 is A
arg2 is B
class object called

我在
调用中使用
self
(在
初始化中初始化沉重的东西,并在
调用中使用它),当我在
调用中不使用
self
时,我将这些对象转换成简单的函数,因为“同一”装饰器正在做两件不同的事情,取决于它是在方法上调用还是在函数上调用?为什么不做两个装饰师呢?
wrap\u me
应该完成什么?如果这两个函数采用不同类型的参数,那么它们是如何执行一个可包装的任务的呢?哎呀,我忽略了Katrielex的答案,这基本上是相同的。如果没人介意,我就把它挂在这里举例说明。