我们知道可以设置这样的函数的属性:
def foo():
pass
foo.__setattr__("nameattr","myname")
现在,我想将它设置为:
def foo():
#self.__setattr__("nameattr","myname")
pass
有没有解决方案?
答案 0 :(得分:0)
函数没有实例,它们只接受输入(或没有输入)和计算。这是一个类:
In [7]: class Foo(object):
...: def __init__(self):
...: self.__setattr__("nameattr", "myname")
...:
In [8]: foo = Foo()
In [9]: foo.nameattr
Out[9]: 'myname'
这样做的正常方法是:
In [10]: class Foo(object):
....: def __init__(self, name):
....: self.name = name
....:
In [11]: foo = Foo("John")
In [12]: foo.name
Out[12]: 'John'
答案 1 :(得分:0)
您可以将赋值放在函数体内:
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