加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

【Python】Python中的注解“@”

发布时间:2020-12-17 01:23:06 所属栏目:Python 来源:网络整理
导读:p style="border:0px;line-height:1.7;color:rgb(51,51,51);font-family:'-apple-system','SF UI Text',Arial,'PingFang SC','Hiragino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei',sans-serif;font-size:16px;"Python3.0之后加入新特性Decorators,

<p style="border:0px;line-height:1.7;color:rgb(51,51,51);font-family:'-apple-system','SF UI Text',Arial,'PingFang SC','Hiragino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei',sans-serif;font-size:16px;">Python3.0之后加入新特性Decorators,以@为标记修饰function和class。有点类似c++的宏和java的注解。Decorators用以修饰约束function和class,分为带参数和不带参数,影响原有输出,例如类静态函数我们要表达的时候需要函数前面加上修饰@staticmethod或@classmethod,为什么这样做呢?下面用简单的例子来看一下,具体内容可以查看:<a href="http://www.python.org/dev/peps/pep-0318/" rel="nofollow" style="background-color:transparent;color:rgb(15,153,50);border:0px;">官方解释

<h3 style="font-family:'-apple-system',sans-serif;line-height:1.7;color:rgb(47,47,47);font-size:18px;border:0px;">不带参数的单一使用<pre class="prettyprint linenums prettyprinted" style="overflow:auto;font-family:Menlo,'Bitstream Vera Sans Mono','DejaVu Sans Mono',Monaco,Consolas,monospace;font-size:14px;line-height:1.42857;color:rgb(51,51);background:rgb(47,54,64);border:0px !important;"><ol class="linenums" style="border:0px;color:rgb(101,109,120);"><li class="L0" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,'Courier New',monospace;color:inherit;background-color:transparent;border:0px;"><span class="kwd" style="border:0px;color:rgb(79,193,233);">def<span class="pln" style="border:0px;color:rgb(230,233,237);"> spamrun<span class="pun" style="border:0px;color:rgb(230,237);">(<span class="pln" style="border:0px;color:rgb(230,237);">fn<span class="pun" style="border:0px;color:rgb(230,237);">):<li class="L1" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><span class="pln" style="border:0px;color:rgb(230,237);"> <span class="kwd" style="border:0px;color:rgb(79,237);"> sayspam<span class="pun" style="border:0px;color:rgb(230,237);">(<span class="pln" style="border:0px;color:rgb(230,237);">args<span class="pun" style="border:0px;color:rgb(230,237);">):<li class="L2" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> <span class="kwd" style="border:0px;color:rgb(79,233);">print<span class="pun" style="border:0px;color:rgb(230,237);">(<span class="str" style="border:0px;color:rgb(255,206,84);">"spam,spam,spam"<span class="pun" style="border:0px;color:rgb(230,237);">)<li class="L3" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> fn<span class="pun" style="border:0px;color:rgb(230,237);">)<li class="L4" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,233);">return<span class="pln" style="border:0px;color:rgb(230,237);"> sayspam<li class="L5" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><span class="lit" style="border:0px;color:rgb(172,146,236);">@spamrun<li class="L6" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> useful<span class="pun" style="border:0px;color:rgb(230,237);">a<span class="pun" style="border:0px;color:rgb(230,237);">,<span class="pln" style="border:0px;color:rgb(230,237);">b<span class="pun" style="border:0px;color:rgb(230,237);">):<li class="L7" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"><span class="pln" style="border:0px;color:rgb(230,237);">)<li class="L8" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><li class="L9" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,233);">if<span class="pln" style="border:0px;color:rgb(230,237);"> name <span class="pun" style="border:0px;color:rgb(230,237);">==<span class="pln" style="border:0px;color:rgb(230,237);"> <span class="str" style="border:0px;color:rgb(255,84);">"main"<li class="L0" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> useful<span class="pun" style="border:0px;color:rgb(230,237);">(<span class="lit" style="border:0px;color:rgb(172,236);">2<span class="pun" style="border:0px;color:rgb(230,<span class="lit" style="border:0px;color:rgb(172,236);">5<span class="pun" style="border:0px;color:rgb(230,237);">)<span class="pln" style="border:0px;color:rgb(230,237);"> <p style="border:0px;line-height:1.7;color:rgb(51,sans-serif;font-size:16px;">运行结果

<pre class="prettyprint linenums prettyprinted" style="overflow:auto;font-family:Menlo,237);">spam<span class="pun" style="border:0px;color:rgb(230,237);">spam<li class="L1" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,236);">10<p style="border:0px;line-height:1.7;color:rgb(51,sans-serif;font-size:16px;">函数useful本身应该只是打印<code style="font-family:Menlo,monospace;font-size:14.4px;color:rgb(199,37,78);background-color:rgb(249,242,244);border:0px;">10,可是为什么最后的结果是这样的呢,其实我们可以简单的把这个代码理解为

<pre class="prettyprint linenums prettyprinted" style="overflow:auto;font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><li class="L6" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> useful <span class="pun" style="border:0px;color:rgb(230,237);">=<span class="pln" style="border:0px;color:rgb(230,237);">useful<span class="pun" style="border:0px;color:rgb(230,237);">)<li class="L1" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);">)<h3 style="font-family:'-apple-system',47);font-size:18px;border:0px;">不带参数的多次使用<pre class="prettyprint linenums prettyprinted" style="overflow:auto;font-family:Menlo,237);"> spamrun1<span class="pun" style="border:0px;color:rgb(230,237);"> sayspam1<span class="pun" style="border:0px;color:rgb(230,237);">):<li class="L8" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,84);">"spam1,spam1,spam1"<span class="pun" style="border:0px;color:rgb(230,237);">)<li class="L9" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);">)<li class="L0" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> sayspam1<li class="L1" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><li class="L2" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,236);">@spamrun<li class="L3" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,236);">@spamrun1<li class="L4" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);">):<li class="L5" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);">)<li class="L6" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><li class="L7" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,84);">"main"<li class="L8" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);">spam1<span class="pun" style="border:0px;color:rgb(230,237);">spam1<li class="L2" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,sans-serif;font-size:16px;">这个代码理解为

<pre class="prettyprint linenums prettyprinted" style="overflow:auto;font-family:Menlo,84);">"main"<li class="L1" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);">spamrun<span class="pun" style="border:0px;color:rgb(230,237);">))<li class="L2" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,47);font-size:18px;border:0px;">带参数的单次使用<pre class="prettyprint linenums prettyprinted" style="overflow:auto;font-family:Menlo,237);"> attrs<span class="pun" style="border:0px;color:rgb(230,237);">(<span class="pln" style="border:0px;color:rgb(230,237);">kwds<span class="pun" style="border:0px;color:rgb(230,237);"> decorate<span class="pun" style="border:0px;color:rgb(230,237);">f<span class="pun" style="border:0px;color:rgb(230,233);">for<span class="pln" style="border:0px;color:rgb(230,237);"> k <span class="kwd" style="border:0px;color:rgb(79,233);">in<span class="pln" style="border:0px;color:rgb(230,237);"> kwds<span class="pun" style="border:0px;color:rgb(230,237);">:<li class="L3" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> setattr<span class="pun" style="border:0px;color:rgb(230,237);"> k<span class="pun" style="border:0px;color:rgb(230,237);">[<span class="pln" style="border:0px;color:rgb(230,237);">k<span class="pun" style="border:0px;color:rgb(230,237);">])<li class="L4" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> f<li class="L5" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> decorate<li class="L7" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><li class="L8" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,236);">@attrs<span class="pun" style="border:0px;color:rgb(230,237);">versionadded<span class="pun" style="border:0px;color:rgb(230,237);">=<span class="str" style="border:0px;color:rgb(255,84);">"2.2"<span class="pun" style="border:0px;color:rgb(230,<li class="L9" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> author<span class="pun" style="border:0px;color:rgb(230,84);">"Guido van Rossum"<span class="pun" style="border:0px;color:rgb(230,237);"> mymethod<span class="pun" style="border:0px;color:rgb(230,237);">getattr<span class="pun" style="border:0px;color:rgb(230,237);">mymethod<span class="pun" style="border:0px;color:rgb(230,<span class="str" style="border:0px;color:rgb(255,84);">'versionadded'<span class="pun" style="border:0px;color:rgb(230,236);">0<span class="pun" style="border:0px;color:rgb(230,84);">'author'<span class="pun" style="border:0px;color:rgb(230,237);">))<li class="L3" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><li class="L5" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,84);">"main"<li class="L6" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,236);">2.2<li class="L1" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><span class="typ" style="border:0px;color:rgb(79,233);">Guido<span class="pln" style="border:0px;color:rgb(230,237);"> van <span class="typ" style="border:0px;color:rgb(79,233);">Rossum<li class="L2" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,236);">2<p style="border:0px;line-height:1.7;color:rgb(51,237);"> mymethod <span class="pun" style="border:0px;color:rgb(230,<li class="L2" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> author<span class="pun" style="border:0px;color:rgb(230,84);">"Guido van Rossum).(mymethod)<li class="L3" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><span class="str" style="border:0px;color:rgb(255,84);"> mymethod(2)<h3 style="font-family:'-apple-system',47);font-size:18px;border:0px;">带参数的多次使用<p style="border:0px;line-height:1.7;color:rgb(51,sans-serif;font-size:16px;">这次我们来看一个比较实际的例子,检查我们函数的输入输出是否符合我们的标准,比如我们希望的输入是(int,(int,float))输出是(int,float),这个例子在官网里有,但是在3.6版本中使用有些问题,这里进行了一些改动,如果要进一步了解可以看下functionTool。

<pre class="prettyprint linenums prettyprinted" style="overflow:auto;font-family:Menlo,237);"> accepts<span class="pun" style="border:0px;color:rgb(230,237);">types<span class="pun" style="border:0px;color:rgb(230,237);"> check_accepts<span class="pun" style="border:0px;color:rgb(230,237);"> new_f<span class="pun" style="border:0px;color:rgb(230,237);"> <span class="pun" style="border:0px;color:rgb(230,237);">
<span class="pln" style="border:0px;color:rgb(230,237);">):<li class="L3" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> <span class="kwd" style="border:0px;color:rgb(79,233);">assert<span class="pln" style="border:0px;color:rgb(230,237);"> len<span class="pun" style="border:0px;color:rgb(230,237);">len<span class="pun" style="border:0px;color:rgb(230,237);">+<span class="pln" style="border:0px;color:rgb(230,237);">)),237);"> <li class="L4" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> <span class="str" style="border:0px;color:rgb(255,84);">"args cnt %d does not match %d"<span class="pln" style="border:0px;color:rgb(230,237);">%<span class="pln" style="border:0px;color:rgb(230,237);">),237);">))<li class="L5" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> t<span class="pun" style="border:0px;color:rgb(230,237);"> <span class="kwd" style="border:0px;color:rgb(79,237);"> zip<span class="pun" style="border:0px;color:rgb(230,237);"> types<span class="pun" style="border:0px;color:rgb(230,237);">):<li class="L6" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> <span class="kwd" style="border:0px;color:rgb(79,237);"> isinstance<span class="pun" style="border:0px;color:rgb(230,237);"> <li class="L7" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> <span class="str" style="border:0px;color:rgb(255,84);">"arg %r does not match %s"<span class="pln" style="border:0px;color:rgb(230,237);"> f<span class="pun" style="border:0px;color:rgb(230,monospace;color:inherit;background-color:transparent;border:0px;"><li class="L0" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> update_wrapper<span class="pun" style="border:0px;color:rgb(230,237);">new_f<span class="pun" style="border:0px;color:rgb(230,237);"> new_f<li class="L2" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,monospace;color:inherit;background-color:transparent;border:0px;"><li class="L3" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> check_accepts<li class="L4" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> returns<span class="pun" style="border:0px;color:rgb(230,237);">rtype<span class="pun" style="border:0px;color:rgb(230,237);"> check_returns<span class="pun" style="border:0px;color:rgb(230,237);"> result <span class="pun" style="border:0px;color:rgb(230,237);">result<span class="pun" style="border:0px;color:rgb(230,237);"> rtype<span class="pun" style="border:0px;color:rgb(230,237);"> <li class="L0" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,84);">"return value %r does not match %s"<span class="pln" style="border:0px;color:rgb(230,237);"> result<li class="L2" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> new_f<li class="L5" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> check_returns<li class="L7" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,236);">@accepts<span class="pun" style="border:0px;color:rgb(230,237);">(<span class="kwd" style="border:0px;color:rgb(79,233);">int<span class="pun" style="border:0px;color:rgb(230,233);">float<span class="pun" style="border:0px;color:rgb(230,237);">))<li class="L9" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,236);">@returns<span class="pun" style="border:0px;color:rgb(230,237);">((<span class="kwd" style="border:0px;color:rgb(79,237);">))<li class="L0" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> func<span class="pun" style="border:0px;color:rgb(230,237);">arg1<span class="pun" style="border:0px;color:rgb(230,237);"> arg2<span class="pun" style="border:0px;color:rgb(230,237);"> arg1 <span class="pun" style="border:0px;color:rgb(230,237);"> arg2 <li class="L2" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,84);">"main"<li class="L4" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> a <span class="pun" style="border:0px;color:rgb(230,236);">1<span class="pun" style="border:0px;color:rgb(230,84);">'b'<span class="pun" style="border:0px;color:rgb(230,237);">)<li class="L5" style="border:0px;list-style:decimal;"><code style="font-family:Menlo,237);"> <p style="border:0px;line-height:1.7;color:rgb(51,sans-serif;font-size:16px;">这里故意输入了错误的参数,所以运行结果将我们的断言打印了出来

<pre class="prettyprint linenums prettyprinted" style="overflow:auto;font-family:Menlo,233);">AssertionError<span class="pun" style="border:0px;color:rgb(230,237);">:<span class="pln" style="border:0px;color:rgb(230,237);"> arg <span class="str" style="border:0px;color:rgb(255,84);">'b'<span class="pln" style="border:0px;color:rgb(230,237);"> does <span class="kwd" style="border:0px;color:rgb(79,233);">not<span class="pln" style="border:0px;color:rgb(230,237);"> match <span class="pun" style="border:0px;color:rgb(230,237);">(<<span class="kwd" style="border:0px;color:rgb(79,233);">class<span class="pln" style="border:0px;color:rgb(230,84);">'int'<span class="pun" style="border:0px;color:rgb(230,237);">>,237);"><<span class="kwd" style="border:0px;color:rgb(79,84);">'float'<span class="pun" style="border:0px;color:rgb(230,237);">>)<p style="border:0px;line-height:1.7;color:rgb(51,237);"> func <span class="pun" style="border:0px;color:rgb(230,237);">)).(<span class="pln" style="border:0px;color:rgb(230,237);">accepts<span class="pun" style="border:0px;color:rgb(230,237);">)<p style="border:0px;line-height:1.7;color:rgb(51,sans-serif;font-size:16px;">说到这里,大家不难看出其实我们可以使用Decorators做很多工作,简化代码,使逻辑更清晰等。还有更多的用法等着大家自己去挖掘了,这里只简单的介绍了针对函数的用法,其实还可以针对class使用,具体的大家自己看看官方介绍,结合这篇文档应该就不难理解了。

<p style="border:0px;line-height:1.7;color:rgb(51,sans-serif;font-size:16px;">转自:http://www.jcodecraeer.com/a/chengxusheji/chengxuyuan/2017/0418/7842.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读