Python 为什么setattr不影响返回值?

Python 为什么setattr不影响返回值?,python,closures,getattr,setattr,Python,Closures,Getattr,Setattr,我正在使用setattr()来修补一个闭包。使用getattr()显示已正确修补闭包。但是,返回值不受影响 >>> def foo(): ... def bar(): ... return('bar') ... return(bar()) ... >>> def baz(): ... return('baz') ... >>> setattr(foo, 'bar', baz) >>

我正在使用
setattr()
来修补一个闭包。使用
getattr()
显示已正确修补闭包。但是,返回值不受影响

>>> def foo():
...     def bar():
...             return('bar')
...     return(bar())
... 
>>> def baz():
...     return('baz')
... 
>>> setattr(foo, 'bar', baz)
>>> bar = getattr(foo, 'bar')
>>> bar()
'baz'
>>> foo()
'bar'
使用setattr()后,我希望
foo()
返回
'baz'

但是,它会返回
'bar'
,就好像补丁从未出现过一样。

它确实起了作用,只是没有如您所期望的那样:

f = foo.bar

print(f())  # baz
bar
foo
中的嵌套函数;不是它的一个属性。据我所知,没有办法重新分配这样的内部功能


最好是有一个
foo
依赖的外部可访问变量,并根据需要重新分配该变量。或者给它一个可变的对象,让它在外部变为所需的状态。我不能说我会推荐这些选项,但考虑到当前的需求,它们应该会起作用

我不认为
bar
foo
的一个属性;它只是一个嵌套函数。您可能需要执行类似于从外部重新分配
bar
使用的变量的操作。
setattr(foo,'bar',baz)
foo
创建一个属性-谢谢!是的,这似乎是答案。在
setattr()之前使用
getattr(foo,'bar')
抛出
AttributeError
。所以
foo
一开始没有属性
bar
。使用
setattr()
当然会给它一个。这是一个麻烦。有时,嵌套函数可以提供优雅的解决方案。但是,它们在测试过程中很难处理,例如,我可能需要为
bar
注入依赖项。
bar
方法必须以某种方式绑定到
foo
。“但它是可以修补的吗?”JamesRowland不幸的是,我刚开始轮班。我回家后会调查的。我不认为有一种方法不需要事先手动设置一个机制。