首页 > 解决方案 > 有没有办法将属性添加到函数作为函数定义的一部分?

问题描述

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'忘记它?


从评论中编辑了许多其他方式:

标签: pythonpython-3.x

解决方案


不完全是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

这可能比将属性初始化放在函数内的任何东西都更干净。


推荐阅读