首页 > 解决方案 > 在装饰器中分配 self 时如何将其传递给函数实例?

问题描述

我正在尝试将字典键分配给对象函数,但由于某种原因它在装饰器内部不起作用。当我尝试调用 a.run() 时,self 似乎没有被传递到字典 func 中。我也无权访问 f。装饰器中的自我,所以我知道那里一定有问题。我写了一个简单的代码示例。我希望它类似于烧瓶中的 app.route ,因为它初始化端点和函数之间的映射。

错误:

    Traceback (most recent call last):
  File "main.py", line 27, in <module>
    a.run()
  File "main.py", line 14, in run
    self.rmap[k](data)
TypeError: one_way() missing 1 required positional argument: 'data'

代码:

class A (object):
  def __init__(self):
    self.rmap = {}

  def route(self, r):
    def decorator(f):
      self.rmap[r] = f
      return f
    return decorator

  def run(self):
    data = [1,2,3]
    for k in self.rmap.keys():
      self.rmap[k](data)

a = A()

class B (object):
  def __init__(self):
    pass


  @a.route('/one/way')
  def one_way (self, data):
    print('A WAY:{}'.format(self))

b = B()
a.run()

标签: python-3.xpython-decorators

解决方案


调用时self.rmap[k](data),您没有传入self参数。这必须是类的实例B才能工作。

通常,您只需传递调用装饰函数的参数,但您似乎希望以不同的方式使用您的装饰函数。在您的情况下,可行的是:

def run(self):
    data = [1,2,3]
    b = B()
    for k in self.rmap.keys():
        self.rmap[k](b, data)

如果您想在调用之间重用它,您当然也可以在B其他地方实例化该实例。


推荐阅读