你可以把赋值放在函数体内:
def foo():
foo.nameattr = value
或者:
def foo():
setattr(foo, "nameattr", value)
无需显式调用__setattr__。
但是请注意,这将在您每次调用该函数时设置属性,而且您必须调用该函数才能使其工作:
>>> a = 1
>>> def foo():
... global a
... foo.a = a
...
>>> foo.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'a'
>>> foo()
>>> foo.a
1
>>> a = 2
>>> foo.a
1
>>> foo()
>>> foo.a
2
如您所见,如果您在访问之前不调用该函数,则该属性未设置。此外,在每次调用时,值都可能发生变化。
如果您只想设置属性一次就可以使用装饰器。
能够将partial 与setattr 一起使用会很好,但不幸的是setattr 使用仅位置参数。但是我们可以编写自己的包装器:
from functools import partial
def set_attribute(object, name, value):
setattr(object, name, value)
@partial(set_attribute, name="a", value=1)
def foo():
pass
print(foo.a) # -> 1