【问题标题】:How to set attributes of a function when defining this function?定义此函数时如何设置函数的属性?
【发布时间】:2016-11-09 07:51:09
【问题描述】:

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

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

现在,我想这样设置:

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

有什么解决办法吗?

【问题讨论】:

  • 你可以这样做:def foo(): foo.nameattr = myname。但是每次调用该函数时都会设置该属性。而且如果不调用函数,属性也不会被设置!

标签: python function syntax attributes


【解决方案1】:

你可以把赋值放在函数体内:

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

【讨论】:

  • 谢谢,我考虑过使用装饰器或元类。即使我认为可以像类一样继承功能。请原谅我,我只是一个初学者并且有一些幻想。
【解决方案2】:

函数没有实例,它们只是接受输入(或没有输入)并进行计算。作为一个班级这样做:

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 属性。这样项目更容易分开。
猜你喜欢
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多