在其他函数中重新定义python函数

时间:2018-07-19 12:18:58

标签: python function overloading wrapper

我可以弄清楚python的行为。这是代码示例:

def foo():
    print('hello from initial foo')
def using_foo():
    foo()
def wrapper(func):
    def foo():
        print('Now is overload foo')
    print('Hello from wrapper')
    func()
using_foo()
wrapper(using_foo)

这将打印:

  

你好,最初的foo

     

你好来自包装器

     

你好,最初的foo

但是我希望:

  

你好,最初的foo

     

你好来自包装器

     

现在是重载foo

因为下一个可以正常工作:

def foo():                                                                         
    print('Hello from initial foo')                                                
def using_foo():                                                                   
    foo()                                                                          
using_foo()                                                                        
if True:                                                                           
    def foo():                                                                     
        print('now it is overload foo')                                            
    using_foo()

输出:

  

你好,最初的foo

     

现在它是重载foo

2 个答案:

答案 0 :(得分:1)

您只是误输入了func()而不是foo()

def foo():
    print('hello from initial foo')
def using_foo():
    foo()
def wrapper(func):
    def foo():
        print('Now is overload foo')
    print('Hello from wrapper')
    foo()
using_foo()
wrapper(using_foo)

输出:

  

你好,最初的foo
  包装师你好
  现在是重载foo

答案 1 :(得分:0)

您还可以返回内部函数并从外部调用它。对于您当前的示例,这可能是一个过分的矫正。但是,当您深入了解装饰器时,该技术肯定会有所帮助。

def foo():
    print('hello from initial foo')
def using_foo():
    foo()
def wrapper(func):
    def foo():
        print('Now is overload foo')
    print('Hello from wrapper')
    return foo
using_foo()
call_inner_foo = wrapper(using_foo)
call_inner_foo()