如何在python中更改函数对象的属性?

时间:2013-10-24 22:27:59

标签: python function variables attributes

在下面的代码中,我定义了一个具有变量y的函数f。 我试图在函数外调用f.y并抛出错误。 但它允许我分配f.y=11甚至新属性f.x=12。但是调用f()不会更新y。那么f.yf.x附加到哪里。是否可以更改函数内的y

>>> def f():
...   y = 10
...   print y
... 
>>> f.y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'y'
>>> f.y = 11
>>> f()
10

编辑:这也无济于事

    >>> def f():
...   f.y = 10
...   print f.y
... 
>>> f()
10
>>> f.y=11
>>> f()
10
>>

5 个答案:

答案 0 :(得分:4)

如果你解释了你想要完成的事情,也许会更好。首先直接回答你的问题:

f指的是您创建的function对象。您可以将属性分配给具有__dict__属性的任何对象(即您使用f.y=11执行的操作)。继续查看dir(f),您会看到它有一个__dict__。它本质上是一个围绕普通dict的语法包装器,通常可以通过执行类似

的操作来访问它
my_dict['y'] = 10

请注意,此dict nothing 与您在函数中定义的任何本地人有关。通常,您根本不想这样做,而是在需要dict时支持明确的dict。您希望使用此语法访问对象的__dict__:类时的情况。我将在下面简要介绍一下。


现在,既然我认为你正试图在这里重新发明轮子,我会尝试重新审视你应该做什么。由于我不知道你要做什么,我会使用霰弹枪的方法并覆盖我能想到的数量。

- 将其作为函数的参数,或者更好,将其作为默认参数提供给f,您可以选择更改它。

def f(y=10):
    print y

f()
#prints 10

f(y=11)
#prints 11

- f返回您的值。这当然可以让您访问变量。基本的东西,但.. ..

def f(y=10):
    return y

f()
Out[9]: 10

f(y=11)
Out[10]: 11

- 使f成为class。这允许您使用f实例并根据需要对其进行操作。

class F:
    def __init__(self,y=10):
        self.y = y

f1 = F()

f2 = F(y=11)

f1.y, f2.y
Out[17]: (10, 11)

- 最后,全局变量。不要使用全局变量。

答案 1 :(得分:1)

f()中,请参阅y,而不是引用f.y

答案 2 :(得分:1)

您可以将y设置为全局变量,并将其作为global y在函数内部调用。

答案 3 :(得分:0)

在Python中,一切都是object。甚至您定义的函数f也是object

当您说f.y = 11时,您正在为对象y分配名为f的属性。但是,这与您在函数内定义的局部变量y = 10完全不同。

要检查对象,您可以使用dir功能:dir(f)

答案 4 :(得分:0)

y是函数中的局部变量,通过调用f.y = 11在函数对象中创建一个新变量(按dir(f)来查看),它不会改变局部变量y值。

如果您想要更改变量,可以使用此

def f(val):
  y = val
  print y

或使y成为全局变量

y = 10

def f():
  print y