python - 有没有办法将属性添加到函数作为函数定义的一部分?
问题描述
do_something.n
每次调用函数时,函数属性都会递增。
我在函数do_something.n=0
之外声明了属性,这让我很困扰。
我回答了使用 queue.PriorityQueue 的问题,不关心使用“函数属性”的比较来为 PriorityQueue 的使用提供唯一的计数器 - MartijnPieters 有一个更好的解决方案)
MCVE:
def do_something():
do_something.n += 1
return do_something.n
# need to declare do_something.n before usign it, else
# AttributeError: 'function' object has no attribute 'n'
# on first call of do_something() occures
do_something.n = 0
for _ in range(10):
print(do_something()) # prints 1 to 10
还有什么其他方法可以定义函数“内部”的属性,以免AttributeError: 'function' object has no attribute 'n'
忘记它?
从评论中编辑了许多其他方式:
解决方案
不完全是inside,但是一个装饰器使函数属性更加明显:
def func_attr(**attrs):
def wrap(f):
f.__dict__.update(attrs)
return f
return wrap
@func_attr(n=0)
def do_something():
do_something.n += 1
return do_something.n
这可能比将属性初始化放在函数内的任何东西都更干净。
推荐阅读
- java - 我们如何控制 OSGI 上资源的网页缓存?
- javascript - 我可以在它进入控制台之前捕获一个 socket.io 错误吗?
- c# - MVC - 渲染值和名称属性
- c# - .NET 为应用程序配置服务器证书
- python - Line2D服装图例只有一点
- uiscrollview - 使用带有 iOS 13 可拉动模式的无限滚动 UICollectionView
- node.js - 为什么使用 n 安装 nodejs ubuntu 时缺少目录?
- mysql - Mysql:比较一张表中两列的值
- php - Laravel Imap connect() 慢 | 重用?
- jquery - 使用 jquery 在开始时重置时间计数器