定义此函数时如何设置函数的属性?

时间:2016-11-09 07:51:10

标签: python function syntax attributes

我们知道可以设置这样的函数的属性:

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

现在,我想将它设置为:

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

有没有解决方案?

2 个答案:

答案 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

如果您在访问该函数之前未调用该函数,则可以看到该属性未设置。此外,在每一个电话中,价值都可能发生变化。

如果您只想设置属性,则可以使用装饰器。 能够将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