Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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 - Fatal编程技术网

Python 丢弃装饰工

Python 丢弃装饰工,python,Python,你能帮我理解一个函数在有装饰器和没有装饰器的情况下是否都可以使用吗 例如: def makeitalic(fn): def wrapped(): return "<i>" + fn() + "</i>" return wrapped @makeitalic def hello(): return "hello, sir or madam!" 那么,可以在没有装饰器的情况下使用hello()吗?一般不可以。修饰函数替换原始函数,因

你能帮我理解一个函数在有装饰器和没有装饰器的情况下是否都可以使用吗

例如:

def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped

@makeitalic
def hello():
    return "hello, sir or madam!"

那么,可以在没有装饰器的情况下使用hello()吗?

一般不可以。修饰函数替换原始函数,因此除非修饰器本身显式地使其可用(例如,将其存储在某个全局注册表中或作为某个对象的属性),否则无法获取原始函数。(您可以将其作为装饰函数的闭包对象中的单元格变量访问,但这不是非常健壮,除了测试和实验之外,不应该依赖它。)

一般来说不是这样。修饰函数替换原始函数,因此除非修饰器本身显式地使其可用(例如,将其存储在某个全局注册表中或作为某个对象的属性),否则无法获取原始函数。(您可以在修饰函数的闭包对象中作为单元格变量访问它,但这不是非常健壮,除了测试和实验之外,不应该依赖它。)

注意
italic\u hello=makeitalic(hello)
会更简单-这基本上就是
@makeitalic
的语法糖所做的。您可以将实际函数作为属性分配给
wrapped
。如果您需要这种动态行为,不要使用装饰器。我将对此进行一点扩展,因为我认为DUP解决了细节问题,而不是更大的问题。decorator的目的是表示“静态”源代码级的组合。如果你想的是某种运行时,可以完成、撤消、修改等的动态合成,那么装饰器不是你想要的会更简单-这基本上就是
@makeitalic
的语法糖所做的。您可以将实际函数作为属性分配给
wrapped
。如果您需要这种动态行为,不要使用装饰器。我将对此进行一点扩展,因为我认为DUP解决了细节问题,而不是更大的问题。decorator的目的是表示“静态”源代码级的组合。如果你想的是某种运行时,可以完成、撤消、修改等动态组合,那么装饰器不是你想要的。
def hello():
    return "hello, sir or madam!"

@makeitalic
def italic_hello():
    return(hello())