【发布时间】:2015-09-26 11:51:36
【问题描述】:
我知道如何重写方法:
class Foo(object):
def bar(self):
return True
def damn_monkeys(self):
return False
Foo.bar = damn_monkeys
有没有可能用函数实现类似的东西?
def foo(arg1):
def bar(arg2):
return 1
return bar(arg1)
foo.bar = monkeys # doesn't work as bar obviously isn't an attribute
我找到了一些钩子 (func_code),但这些似乎是专供检查员使用的,摆弄它们似乎相当可疑。
我还注意到函数有 __init__ 和 __call__ 引用,但它们似乎指向 __builtin__.__function 对象。我没有进一步检查,但似乎函数也是对象(这很有意义,阅读 python 中的所有内容都是一个对象)。我想函数已经是 __function 对象的实例,这就是为什么 foo.__init__ 不会引发错误,但它从未被调试器触及。
有没有办法在不复制或修补代码的情况下覆盖内部函数?
编辑与答案重复:Can you patch *just* a nested function with closure, or must the whole outer function be repeated?
【问题讨论】:
-
我认为您应该阅读更多关于一般命名空间的信息。如果 oject 有一个类型或另一个类型,这并没有太大的区别。为了达到它,python 必须在命名空间中查找它。
-
如果你需要"override"它,你为什么不把它改造成不是一个内部函数呢?请注意,您实际上可以为函数赋予任意属性,因此您可以将
bar变为foo.bar。 -
@jonrsharpe 背景信息代码实际上要长得多,并且在第 3 方包中,我不能那样更改它
-
你能提供一个不那么抽象的例子吗?你真正想要达到什么目的?嵌套函数的全部意义在于,它仅在函数内部是必需的,作为一个实现细节,其他代码都不应该关心,所以它们很难理解。
-
内层函数其实是外层函数的局部变量。所以你的问题相当于_“我可以从函数外部更改函数局部变量吗?”。 AFAIK,答案是:不,除非您愿意修改函数本身的字节码。