可以通过调用另一个函数来覆盖一个函数吗?

时间:2013-01-29 19:02:54

标签: python function local

假设您有函数ab。您是否可以通过调用函数a将函数b替换为另一个函数?

我知道您可以执行b=a(b),但是您可以仅使用b更改a(b)吗?

5 个答案:

答案 0 :(得分:4)

函数和方法分别是模块和类的属性。因此,您可以修改所需的属性以指向另一个函数。

>>> __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')。

不确定为什么你会这么想?它会使代码混乱。

答案 1 :(得分:4)

您可以将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

虽然这几乎肯定是一个迹象,但你正在思考你试图以错误的方式解决的任何问题。

答案 2 :(得分:2)

你可以使用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
>>>

答案 3 :(得分:1)

我不确定你的目标是什么,但是,你可以这样做:

>>> def a():
...     global b
...     b = a
...     return 'a'
... 
>>> def b():
...     return 'b'
... 
>>> b()
'b'
>>> a()
'a'
>>> b()
'a'
>>> def c(f):
  

如果我不知道我事先要覆盖b怎么办?换句话说,如果我想把b作为参数传递给

>>> 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'

答案 4 :(得分:1)

你可以像这样轻松地完成

def a(func):
    globals()[func] = c

def b():
    print('b')

def c():
    print('c')

a()
b()
>>> c