2016-11-09 74 views
0

我们知道,一个可以设置功能的属性是这样的:如何在定义此函数时设置函数的属性?

def foo(): 
    pass 
foo.__setattr__("nameattr","myname") 

现在,我想设置这样的:

def foo(): 
    #self.__setattr__("nameattr","myname") 
    pass 

有没有什么解决办法吗?

+0

您可以这样做:'def foo():foo.nameattr = myname'。但是,每次调用该函数时都会设置该属性。此外,如果您不调用该函数,则该属性将不会被设置! – Bakuriu

回答

0

你可以把函数体内部的分配:

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 

正如你所看到的属性未设置,如果你不在访问它之前不要调用该函数。而且在每一次呼叫中,价值都可能发生变化。

如果您想只使用装饰器设置属性。 能够仅使用partialsetattr会很好,但不幸的是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 
+0

谢谢,我曾考虑过使用装饰器或元类。即使我认为可以继承类功能。请原谅我,我只是一个初学者,有一些幻想。 – hurrytospring

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' 
+0

感谢您的回答。但那并不是我真正想要的。实际上,在使用瓶子时,我想让响应函数声明它自己的url属性,这样项目就更容易分离了。 – hurrytospring

相关问题