我们知道,一个可以设置功能的属性是这样的:如何在定义此函数时设置函数的属性?
def foo():
pass
foo.__setattr__("nameattr","myname")
现在,我想设置这样的:
def foo():
#self.__setattr__("nameattr","myname")
pass
有没有什么解决办法吗?
我们知道,一个可以设置功能的属性是这样的:如何在定义此函数时设置函数的属性?
def foo():
pass
foo.__setattr__("nameattr","myname")
现在,我想设置这样的:
def foo():
#self.__setattr__("nameattr","myname")
pass
有没有什么解决办法吗?
你可以把函数体内部的分配:
def foo():
foo.nameattr = value
或者:
def foo():
setattr(foo, "nameattr", value)
没有必要t o明确地呼叫__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
谢谢,我曾考虑过使用装饰器或元类。即使我认为可以继承类功能。请原谅我,我只是一个初学者,有一些幻想。 – hurrytospring
函数没有实例,只是输入(或没有输入)和计算。做到这一点的一类:
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'
感谢您的回答。但那并不是我真正想要的。实际上,在使用瓶子时,我想让响应函数声明它自己的url属性,这样项目就更容易分离了。 – hurrytospring
您可以这样做:'def foo():foo.nameattr = myname'。但是,每次调用该函数时都会设置该属性。此外,如果您不调用该函数,则该属性将不会被设置! – Bakuriu