Python装饰器与staticmethod一起工作。但使用2个静态方法失败。为什么?

Python装饰器与staticmethod一起工作。但使用2个静态方法失败。为什么?,python,static-methods,python-decorators,Python,Static Methods,Python Decorators,这是我的python代码。我有一个类MyClass,它有两个静态方法:myu方法1和myu方法2。这两个方法都用一个名为异常处理程序的装饰程序包装 from functools import wraps import sys def exception_handler(function): @wraps(function) def decorator(self, *args, **kwargs): try: return function

这是我的python代码。我有一个类
MyClass
,它有两个静态方法:
myu方法1
myu方法2
。这两个方法都用一个名为
异常处理程序
的装饰程序包装

from functools import wraps
import sys

def exception_handler(function):
    @wraps(function)
    def decorator(self, *args, **kwargs):
        try:
            return function(self, *args, **kwargs)
        except Exception, e:
            print "EXCEPTION!: %s" % e
            sys.exit(-1)
    return decorator


class MyClass:
    @staticmethod
    @exception_handler
    def my_method1(a, b, c,):
        return "X"

    @staticmethod
    @exception_handler
    def my_method2(e, f, g,):
        print "Y"
        return MyClass.my_method1(a=e, b=f, c=g)

print "Trying my_method1"
print MyClass.my_method1(1, 2, 3)

print ""
print "Trying my_method2"
print MyClass.my_method2(1, 2, 3)
当我运行此代码时,我得到以下信息:

Trying my_method1
X

Trying my_method2
Y
EXCEPTION!: decorator() takes at least 1 argument (0 given)
为什么装潢师在第二个例子中失败了,我怎么才能避免呢


当装饰方法是由另一个静态方法调用的静态方法时,装饰器似乎失败了。但是为什么会发生这种情况对我来说毫无意义。

问题在于
静态方法
不将self作为参数。我不知道为什么它在前两次通话中有效,而在第三次通话中无效。但是,从装饰器中删除
self
可以修复它

以下是重构后的代码:

from functools import wraps
import sys


def exception_handler(function):
    @wraps(function)
    def decorator(*args, **kwargs):
        try:
            return function(*args, **kwargs)
        except Exception as e:
            print "EXCEPTION!: {}".format(e)
            sys.exit(-1)

    return decorator


class MyClass(object):
    @staticmethod
    @exception_handler
    def my_method1(a, b, c, ):
        return "X"

    @staticmethod
    @exception_handler
    def my_method2(e, f, g, ):
        print "Y"
        return MyClass.my_method1(a=e, b=f, c=g)


print "Trying my_method1"
print MyClass.my_method1(1, 2, 3)

print
print "Trying my_method2"
print MyClass.my_method2(1, 2, 3)
这样做会产生以下结果:

Trying my_method1
X

Trying my_method2
Y
X

我认为您的代码在您没有注意到的情况下失败了,您能试着打印
a、b、c
*参数吗?你会发现
a
self
!!!因此,由于分配了错误的参数,它悄悄地失败了


那么为什么它会在第二次调用时引发异常:
MyClass.my_method1(a=e,b=f,c=g)
这是因为你的*args现在是空的,self不能像以前那样替换任何变量。

为什么内部函数中有一个“self”?静态方法不将self或cls作为第一个参数
异常除外,e:
:如果可能,请使用
异常除外作为e:
。此语法已被修改为.ozy。此装饰器用于静态方法和非静态类方法。这对双方都有效。。。。直到我尝试从另一个包装静态方法中调用一个包装静态方法。感谢Evert指出这一点。我将进行更改。因此,我希望在静态和非静态方法上都有这样一个用于异常处理的修饰符。我需要两个不同的装饰师吗?是的。否则,您需要像这样调用静态方法:
MyClass.my\u method1(\uu,1,2,3)
。。。