<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Python%E5%87%BD%E6%95%B0%E4%BF%AE%E9%A5%B0%E7%AC%A6%40</id>
	<title>Python函数修饰符@ - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Python%E5%87%BD%E6%95%B0%E4%BF%AE%E9%A5%B0%E7%AC%A6%40"/>
	<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Python%E5%87%BD%E6%95%B0%E4%BF%AE%E9%A5%B0%E7%AC%A6@&amp;action=history"/>
	<updated>2026-04-17T02:16:40Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.linuxsa.org/index.php?title=Python%E5%87%BD%E6%95%B0%E4%BF%AE%E9%A5%B0%E7%AC%A6@&amp;diff=869&amp;oldid=prev</id>
		<title>Evan：​/* see also */</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Python%E5%87%BD%E6%95%B0%E4%BF%AE%E9%A5%B0%E7%AC%A6@&amp;diff=869&amp;oldid=prev"/>
		<updated>2021-06-29T08:50:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;see also&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=python函数修饰符@的作用是为现有函数增加额外的功能，常用于插入日志、性能测试、事务处理等等。=&lt;br /&gt;
&lt;br /&gt;
创建函数修饰符的规则：&lt;br /&gt;
（1）修饰符是一个函数&lt;br /&gt;
（2）修饰符取被修饰函数为参数&lt;br /&gt;
（3）修饰符返回一个新函数&lt;br /&gt;
（4）修饰符维护被维护函数的签名&lt;br /&gt;
&lt;br /&gt;
=例子1：被修饰函数不带参数=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def log(func):&lt;br /&gt;
    def wrapper():&lt;br /&gt;
        print(&amp;#039;log开始 ...&amp;#039;)&lt;br /&gt;
        func()&lt;br /&gt;
        print(&amp;#039;log结束 ...&amp;#039;)&lt;br /&gt;
    return wrapper&lt;br /&gt;
    &lt;br /&gt;
@log&lt;br /&gt;
def test():&lt;br /&gt;
    print(&amp;#039;test ..&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
test()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
运行结果：&lt;br /&gt;
&lt;br /&gt;
log开始 ...&lt;br /&gt;
test ..&lt;br /&gt;
log结束 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=例子2：使用functools模块提供的修改函数属性的方法wraps=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def log(func):&lt;br /&gt;
    def wrapper():&lt;br /&gt;
        print(&amp;#039;log开始 ...&amp;#039;)&lt;br /&gt;
        func()&lt;br /&gt;
        print(&amp;#039;log结束 ...&amp;#039;)&lt;br /&gt;
    return wrapper&lt;br /&gt;
    &lt;br /&gt;
@log&lt;br /&gt;
def test1():&lt;br /&gt;
    print(&amp;#039;test1 ..&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
def test2():&lt;br /&gt;
    print(&amp;#039;test2 ..&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
print(test1.__name__)&lt;br /&gt;
print(test2.__name__)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
运行结果：&lt;br /&gt;
&lt;br /&gt;
wrapper&lt;br /&gt;
test2&lt;br /&gt;
&lt;br /&gt;
可见test1的函数名称变了，如果某些代码用到就会出问题，可以使用functools模块提供的修改函数属性的方法wraps 也就不改变func name&lt;br /&gt;
&lt;br /&gt;
from functools import wraps&lt;br /&gt;
&lt;br /&gt;
def log(func):&lt;br /&gt;
    @wraps(func)&lt;br /&gt;
    def wrapper():&lt;br /&gt;
        print(&amp;#039;log开始 ...&amp;#039;)&lt;br /&gt;
        func()&lt;br /&gt;
        print(&amp;#039;log结束 ...&amp;#039;)&lt;br /&gt;
    return wrapper&lt;br /&gt;
    &lt;br /&gt;
@log&lt;br /&gt;
def test1():&lt;br /&gt;
    print(&amp;#039;test1 ..&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
def test2():&lt;br /&gt;
    print(&amp;#039;test2 ..&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
print(test1.__name__)&lt;br /&gt;
print(test2.__name__)&lt;br /&gt;
&lt;br /&gt;
运行结果：&lt;br /&gt;
&lt;br /&gt;
test1&lt;br /&gt;
test2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=例子3：被修饰函数带参数=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from functools import wraps&lt;br /&gt;
&lt;br /&gt;
def log(func):&lt;br /&gt;
    @wraps(func)&lt;br /&gt;
    def wrapper(*args,**kwargs):&lt;br /&gt;
        print(&amp;#039;log开始 ...&amp;#039;,func.__name__)&lt;br /&gt;
        ret = func(*args,**kwargs)&lt;br /&gt;
        print(&amp;#039;log结束 ...&amp;#039;)&lt;br /&gt;
        return ret&lt;br /&gt;
    return wrapper&lt;br /&gt;
    &lt;br /&gt;
@log&lt;br /&gt;
def test1(s):&lt;br /&gt;
    print(&amp;#039;test1 ..&amp;#039;, s)&lt;br /&gt;
    return s&lt;br /&gt;
&lt;br /&gt;
@log&lt;br /&gt;
def test2(s1, s2):&lt;br /&gt;
    print(&amp;#039;test2 ..&amp;#039;, s1, s2)&lt;br /&gt;
    return s1 + s2&lt;br /&gt;
&lt;br /&gt;
test1(&amp;#039;a&amp;#039;)&lt;br /&gt;
test2(&amp;#039;a&amp;#039;,&amp;#039;bc&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
运行结果：&lt;br /&gt;
&lt;br /&gt;
log开始 ... test1&lt;br /&gt;
test1 .. a&lt;br /&gt;
log结束 ...&lt;br /&gt;
log开始 ... test2&lt;br /&gt;
test2 .. a bc&lt;br /&gt;
log结束 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=例子4：修饰符带参数，需要比上面例子多一层包装=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from functools import wraps&lt;br /&gt;
&lt;br /&gt;
def log(arg):    &lt;br /&gt;
    def _log(func):&lt;br /&gt;
        @wraps(func)&lt;br /&gt;
        def wrapper(*args,**kwargs):&lt;br /&gt;
            print(&amp;#039;log开始 ...&amp;#039;,func.__name__, arg)            &lt;br /&gt;
            ret = func(*args,**kwargs)&lt;br /&gt;
            print(&amp;#039;log结束 ...&amp;#039;)&lt;br /&gt;
            return ret&lt;br /&gt;
        return wrapper&lt;br /&gt;
    return _log&lt;br /&gt;
 &lt;br /&gt;
@log(&amp;#039;module1&amp;#039;)&lt;br /&gt;
def test1(s):&lt;br /&gt;
    print(&amp;#039;test1 ..&amp;#039;, s)&lt;br /&gt;
    return s&lt;br /&gt;
&lt;br /&gt;
@log(&amp;#039;module1&amp;#039;)&lt;br /&gt;
def test2(s1, s2):&lt;br /&gt;
    print(&amp;#039;test2 ..&amp;#039;, s1, s2)&lt;br /&gt;
    return s1 + s2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
test1(&amp;#039;a&amp;#039;)&lt;br /&gt;
test2(&amp;#039;a&amp;#039;,&amp;#039;bc&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
运行结果：&lt;br /&gt;
&lt;br /&gt;
log开始 ... test1 module1&lt;br /&gt;
test1 .. a&lt;br /&gt;
log结束 ...&lt;br /&gt;
log开始 ... test2 module1&lt;br /&gt;
test2 .. a bc&lt;br /&gt;
log结束 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=see also=&lt;br /&gt;
[https://www.cnblogs.com/gdjlc/p/11182441.html  python函数修饰符@的使用 ]&lt;br /&gt;
&lt;br /&gt;
[[category:python]] [[category:devops]]&lt;/div&gt;</summary>
		<author><name>Evan</name></author>
	</entry>
</feed>