假设你有函数a
和b
. 您可以通过调用 functiona
将 function 替换b
为另一个函数吗?
我知道你可以做到b=a(b)
,但你能通过做来改变b
吗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') 替换为您的变量即可。
不知道为什么你会想要?它会使代码混乱。
您可以将代码对象替换为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
尽管这几乎可以肯定表明您正在以错误的方式思考您试图解决的任何问题。
你可以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_code
将一个函数的代码替换为另一个函数的代码。
>>> 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 c(f):
... global b
... b = f
... return 'c'
...
>>> def d():
... return 'd'
...
>>> b()
'a'
>>> c(d)
'c'
>>> b()
'd'
>>> c(a)
'c'
>>> b()
'a'
你可以像这样轻松地做到这一点
def a(func):
globals()[func] = c
def b():
print('b')
def c():
print('c')
a()
b()
>>> c