- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解Python中最难理解的点-装饰器由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文将带领大家由浅入深的去窥探一下,这个装饰器到底是何方神圣,看完本篇,装饰器就再也不是难点了. 。
1、什么是装饰器 。
网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象 。
装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效 。
2、装饰器的前传4步曲 。
为什么讲装饰器要放在入门篇的末尾讲呢,因为这货太难了,里面有许多前提要懂。Python的函数相信大家都懂了,但是大家知不知道函数也是一种对象,可以像参数一样传递,我们看下面的例子吧:
1)函数也是对象 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def
message(word
=
'hello'
):
return
word.upper()
+
'!'
print
message()
>>
HELLO!
my_message
=
message
print
my_message
>>
<function message at
0x000000000288E198
>
print
my_message()
>>
HELLO!
|
也就是说message可以赋值给另外一个变量 。
2)函数可以嵌套,定义在另外一个函数内部 。
1
2
3
4
5
6
7
8
9
10
|
def
show():
print
'Run in show()'
def
message(word
=
'hello'
):
return
word
print
message()
show()
>>
Run
in
show()
hello
|
message可以嵌套在show函数里面,调用show的时候也会跑下message函数 。
3)函数作为参数返回 。
一个函数还可以当做另外一个函数的返回值,不信看下面这个例子 。
1
2
3
|
>>
<function lower at
0x00000000027DAD68
>
hello...
|
4)函数作为参数传入 。
我们先创建一个getName函数,然后把这个函数当做参数传递给foo函数 。
1
2
3
|
>>
I will call the getName function later
leo
|
3、装饰器的真面目 。
1).经过前面几步,大家应该理解了函数可以作为参数传入,也可以当参数返回,而且还可以嵌套 装饰器其实就是对函数进行再次包装,它能够在不改变函数的前提下,增加函数的功能,可以在函数执行之前或者执行之后执行一段代码 。
1
2
3
4
5
6
7
8
9
|
a_stand_alone_function()
>>
I am a stand alone function,don't you dare modify me
a_stand_alone_function_decorated
=
my_new_decorator(a_stand_alone_function)
a_stand_alone_function_decorated()
>>
Before the function runs
I am a stand alone function,don't you dare modify me
After the function runs
|
2).使用装饰器 。
看这样简单吧,装饰器有一个语法糖@,直接@my_new_decorator就把上面一坨代码轻松化解了,这就是Pythonic的代码,简洁高效 。
其实相当于
1
|
another_stand_alone_function
=
my_new_decorator(another_stand_alone_function)
|
4、为什么要使用装饰器 。
装饰器提供了一些和代码维护性和审美相关的优点。并且作为结构化工具,装饰器自然地促进了代码的封装,这减少了冗余性并使得未来维护和扩展变得更容易.
如果大家学过Django和Flask就会知道,web框架里面大量的使用装饰器进行代码的封装.我们下面看一个简单的例子
我们有一个主题函数word()是输出一个字符串,我们有一个函数是把字符串变粗体,另外一个是变斜体。有了装饰器之后,我们可以非常灵活的组合,扩展函数的功能
1
2
|
>>
<b><i>hello<
/
i><
/
b>
|
有一点要注意,就是装饰器的顺序变了,结果是不一样的. 。
1
2
3
4
5
6
7
|
@makeitalic
@makebold
def
word():
return
"hello"
print
word()
>>
<i><b>hello<
/
b><
/
i>
|
好了装饰器的入门,就讲到这里,若有什么不懂的,也可以留言跟我探讨交流。其实还有很多装饰器的高级用法,比如装饰器传参数,类的装饰器等等我们后面会讲解.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:https://ask.hellobi.com/blog/caoniao_xueyuan/7111 。
最后此篇关于详解Python中最难理解的点-装饰器的文章就讲到这里了,如果你想了解更多关于详解Python中最难理解的点-装饰器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!