python-3.x - 在装饰器中分配 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()
解决方案
调用时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
其他地方实例化该实例。
推荐阅读
- python - 使用具有两列以上的 df 的子图中的堆积条
- angular - Angular Rxjs 在执行后通过 forkJoin 从 observables 数组中获取错误
- python - 从 Django 中的自定义模板标签访问使用 FileStorage 存储的图像
- c - 不知道怎么调用函数
- postgresql - 为什么 Jooq 代码生成会与 PostGIS 发生冲突?
- json - 检查 WP REST API 的 JWT 身份验证中的 JSON 对象是否为空
- c# - WPF 动画不连贯
- geolocation - 具有 IP 地址的 Web 访问数据集
- go - Route53:按域名查询域记录
- wordpress - 需要帮助寻找基于标签自动添加产品属性的方法