gpt4 book ai didi

Python 函数可以有属性吗?

转载 作者:行者123 更新时间:2023-11-28 20:22:53 28 4
gpt4 key购买 nike

我是 Python 的新手,我不明白函数本身怎么可能有属性。在下面的代码中,有一个名为 f 的函数,稍后在代码中,引用了名为 f.count 的内容。一个函数,即 f,怎么会有一个 .count?我收到一条错误消息:“NoneType”对象在该行上没有属性“count”,因此它显然还没有该属性。我如何赋予它该属性?

def fcount(n):
print n.__name__


@fcount
def f(n):
return n+2

for n in range(5):
print n
#print f(n)

print 'f count =',f.count #THE LINE CAUSING THE ERROR MENTIONED ABOVE

@fcount
def g(n):
return n*n

print 'g count =',g.count
print g(3)
print 'g count =',g.count

编辑:添加了 fcount(),它不执行任何操作,以及有关错误的详细信息。

最佳答案

让我们从f的定义开始:

@fcount
def f(n):
return n+2

这定义了一个 f 作为调用函数 fcount 的返回值,它被用作一个装饰器(前导 @) 在这里。

这段代码大致等同于

def f(n):
return n+2

f = fcount(f)

因为装饰器 – fcount – 不返回任何东西,fNone 而不是函数调用站点。

在您的情况下,fcount 应该返回一些函数并向返回的函数添加一个 count 属性。有用的东西(?)可能是

def fcount(fn):
def wrapper(n):
wrapper.count += 1
return fn(n)
wrapper.count = 0
return wrapper

编辑

正如@jonrsharpe 所指出的,通用装饰器可以通过在签名中用 *args**kwargs 捕获它们并在调用另一个函数时的方式相同。名称 argskwargs 按照约定使用。

Python 还有一个辅助函数(装饰器本身)可以将信息(名称、文档字符串和签名信息)从一个函数传输到另一个函数:functools.wraps。一个完整的示例如下所示:

from functools import wraps

def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

@decorator
def f(a, b, c=None):
"The useful f function"
pass

print f.__name__ # `f` rather than `wrapper`
print help(f) # `f(*args, **kwargs) The useful f function` rather than `wrapper(*args, **kwargs)`

关于Python 函数可以有属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22306847/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com