Python 调用另一个函数可以覆盖一个函数吗?
假设你有函数a和b。你能通过调用函数a,用另一个函数替换函数b吗 我知道你可以做b=ab,但你能用ab改变b吗?你可以用global来完成类似的事情Python 调用另一个函数可以覆盖一个函数吗?,python,function,local,Python,Function,Local,假设你有函数a和b。你能通过调用函数a,用另一个函数替换函数b吗 我知道你可以做b=ab,但你能用ab改变b吗?你可以用global来完成类似的事情 >>> def a(): ... global b ... def b(): ... print "New Function B" >>> def b(): ... print "Function B" ... ... >>> b() Function B
>>> def a():
... global b
... def b():
... print "New Function B"
>>> def b():
... print "Function B"
...
...
>>> b()
Function B
>>> a()
>>> b()
New Function B
>>>
如果不知道要替换的方法,可以使用function.func_代码将一个函数的代码替换为另一个函数的代码
>>> def change(old_func, new_func):
... old_func.func_code = new_func.func_code
...
>>> def a():
... print "Function A"
...
>>> def b():
... print "Function B"
...
>>> def c():
... print "Function C"
...
>>>
>>> change(a, b)
>>> a()
Function B
>>> change(a, c)
>>> a()
Function C
>>>
您可以使用global来完成类似的任务
>>> def a():
... global b
... def b():
... print "New Function B"
>>> def b():
... print "Function B"
...
...
>>> b()
Function B
>>> a()
>>> b()
New Function B
>>>
如果不知道要替换的方法,可以使用function.func_代码将一个函数的代码替换为另一个函数的代码
>>> def change(old_func, new_func):
... old_func.func_code = new_func.func_code
...
>>> def a():
... print "Function A"
...
>>> def b():
... print "Function B"
...
>>> def c():
... print "Function C"
...
>>>
>>> change(a, b)
>>> a()
Function B
>>> change(a, c)
>>> a()
Function C
>>>
我不确定你的目标是什么,但是的,你可以做到:
>>> def a():
... global b
... b = a
... return 'a'
...
>>> def b():
... return 'b'
...
>>> b()
'b'
>>> a()
'a'
>>> b()
'a'
>>> def c(f):
如果我事先不知道我在重写b呢?换句话说,如果我想把b作为参数传递给a呢
我不确定你的目标是什么,但是的,你可以做到:
>>> def a():
... global b
... b = a
... return 'a'
...
>>> def b():
... return 'b'
...
>>> b()
'b'
>>> a()
'a'
>>> b()
'a'
>>> def c(f):
如果我事先不知道我在重写b呢?换句话说,如果我想把b作为参数传递给a呢
函数和方法分别是模块和类的属性。因此,您可以修改所需的属性以指向另一个函数
>>> __name__
'__main__'
>>> def a():
... print 'a'
...
>>> def b():
... print 'b'
...
>>> import sys
>>> sys.modules['__main__'].b = a
>>> b()
a
对于一个类:
>>> class A(object):
... def a(self):
... print 'a'
... def b(self):
... print 'b'
...
>>> A.b = A.a
>>> x = A()
>>> x.b()
a
如果有一个变量包含要替换的名称,则使用setattr,例如:
setattr(sys.modules['__main__'],'b',a)
setattr(A,'b',A.a)
只需用变量替换字符串“b”
不知道你为什么要这么做?函数和方法分别是模块和类的属性。因此,您可以修改所需的属性以指向另一个函数
>>> __name__
'__main__'
>>> def a():
... print 'a'
...
>>> def b():
... print 'b'
...
>>> import sys
>>> sys.modules['__main__'].b = a
>>> b()
a
对于一个类:
>>> class A(object):
... def a(self):
... print 'a'
... def b(self):
... print 'b'
...
>>> A.b = A.a
>>> x = A()
>>> x.b()
a
如果有一个变量包含要替换的名称,则使用setattr,例如:
setattr(sys.modules['__main__'],'b',a)
setattr(A,'b',A.a)
只需用变量替换字符串“b”
不知道你为什么要这么做?这会使代码变得混乱。这样做很容易
def a(func):
globals()[func] = c
def b():
print('b')
def c():
print('c')
a()
b()
>>> c
你可以像这样轻松地做
def a(func):
globals()[func] = c
def b():
print('b')
def c():
print('c')
a()
b()
>>> c
您可以用另一个函数的代码替换b的代码对象:
>>> def b():
... print 'b'
...
>>> def a():
... print 'a'
...
>>> def c(f):
... f.__code__ = a.__code__ # func_code instead of __code__ for py 2.5 and earlier
...
>>> c(b)
>>> b()
a
尽管这几乎可以肯定是一个迹象,表明您正在考虑以错误的方式试图解决的任何问题。您可以用另一个函数的代码替换b的代码对象:
>>> def b():
... print 'b'
...
>>> def a():
... print 'a'
...
>>> def c(f):
... f.__code__ = a.__code__ # func_code instead of __code__ for py 2.5 and earlier
...
>>> c(b)
>>> b()
a
尽管这几乎可以肯定是一个迹象,表明您正在以错误的方式思考任何问题。如果我不知道我正在事先覆盖b,该怎么办?换句话说,如果我想把b作为参数传递给a。我扩展了我的答案,添加了一个函数c,它接受一个可以用来替换b的函数。如果我事先不知道我在重写b呢?换句话说,如果我想将b作为参数传递给a。我扩展了我的答案,添加了一个函数c,它采用了一个可以用来替换b的函数。如果我事先不知道我在重写b呢?换句话说,如果我想将b作为参数传递给a。我在选择使用globals和setattrsys.modules[\u name\u],'b',a之间有点纠结。可能是因为我不太了解全局变量,并且认为既然存在局部变量,那么它就不会在任何地方都起作用。如果我不知道我正在事先覆盖b呢?换句话说,如果我想将b作为参数传递给a。我在选择使用全局变量和setattrsys.modules[\uu name\uuu],'b',a之间有点犹豫。也许是因为我不太了解globals,并且认为既然有本地人,那么它就不会在任何地方都起作用。我写了同样的东西,尽管我使用了更具前向兼容性的代码+1表示知道,但+10表示如果这是答案,问题就出轨了。奇怪的是,python文档的对象模型页面上没有uuu代码uuu,这与uu名称uu和uu文档uu别名不同,但似乎可以回溯到python 2.6,因此经过编辑。我写了同样的东西,尽管我使用了uu代码uu更具前向兼容性+1表示知道,但+10表示如果这是答案,那么问题就出轨了。奇怪的是,python文档的对象模型页面上没有\uuuuu代码\uuuuuuuuuu,这与\uuuu名称和\uuuuuu文档别名不同,但似乎可以返回到经过编辑的python 2.6。