Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调用另一个函数可以覆盖一个函数吗?_Python_Function_Local - Fatal编程技术网

Python 调用另一个函数可以覆盖一个函数吗?

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

假设你有函数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
>>> 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。