Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python装饰程序无法访问被调用的方法_Python_Python 3.x_Class_Python Decorators_Attributeerror - Fatal编程技术网

Python装饰程序无法访问被调用的方法

Python装饰程序无法访问被调用的方法,python,python-3.x,class,python-decorators,attributeerror,Python,Python 3.x,Class,Python Decorators,Attributeerror,我正在尝试为一个方法编写一个decorator,该方法将调用第二个方法。当我运行代码时,我收到错误: AttributeError:“回退”对象没有属性“格式化程序” 简而言之,代码是: class Backoff: def __init__(self, f): self.f = f def __call__(self, *args, **kwargs): n = 1 while n < 11: tr

我正在尝试为一个方法编写一个decorator,该方法将调用第二个方法。当我运行代码时,我收到错误:
AttributeError:“回退”对象没有属性“格式化程序”

简而言之,代码是:

class Backoff:
    def __init__(self, f):
        self.f = f

    def __call__(self, *args, **kwargs):
        n = 1
        while n < 11:
            try:
                return self.f(self, *args, **kwargs)
            except FooError as e:
                <handle error>
                time.sleep((2 ** n) + (random.randint(0, 1000) / 1000))
                n = n + 1

class SomeClass:
    def __init__(self):
        pass
    @Backoff
    def first_method(self, foo, bar):
        return self.formatter(foo, bar)

    def formatter(self, x, y):
        return some_function_to_format(x, y)
类退避:
定义初始化(self,f):
self.f=f
定义调用(self,*args,**kwargs):
n=1
当n<11时:
尝试:
返回self.f(self,*args,**kwargs)
除以下错误外:
睡眠时间((2**n)+(random.randint(0,1000)/1000))
n=n+1
类SomeClass:
定义初始化(自):
通过
@退避
def首_方法(自身、foo、bar):
返回自格式化程序(foo,bar)
def格式化程序(自身、x、y):
将某些函数返回为函数格式(x,y)
如何将第二种方法传递给第一种方法,使装饰师能够识别它


任何帮助都将是惊人的

您正在将一个方法传递给
Backoff
,将其指定为实例变量,然后调用它。在
回退中调用该实例之前,不会将其绑定到实例。\uuu call\uu
,然后将其绑定到
回退的实例,该实例没有
格式化程序
属性


根据您的实例方法需要访问什么,可能有一个简单的解决方案(即,如果它只需要引用类或静态方法,它可以直接调用完全限定名)。但是,如果您需要实例方法来引用实例属性,我建议您根本不要使用类装饰器。使用函数装饰器不会遇到这些问题,您可以创建一个闭包并返回具有相同调用签名的函数。

您的init方法缺少自参数。格式化程序可能也是如此。@jedwards我收到一个错误,说在添加self之前,我的参数数量错误。我认为也没有必要initially@OlivierMelançon最初的代码在两种方法中都有自变量,但是我快速地将其转录到StackOverflow中,并且错误地丢弃了它们。代码已编辑如果您提供可以运行的代码,except语句不允许我复制粘贴您的代码并在没有语法错误的情况下运行它。请确保在询问之前阅读如何创建,这有助于我们帮助您!,描述您的问题、问题以及如何解决它。我不确定formatter是否是一个类方法,至少是这样。非常感谢您,这是一个如此简单的解决方案!