鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[扩展阅读] Python 函数修饰符(装饰器)的使用

  [复制链接]
发表于 2017-4-24 14:23:45 | 显示全部楼层
零基础入门学习Python封面
《零基础入门学习Python》
(最新版)
小甲鱼 著
立即购买
看得有点晕
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-28 10:25:54 | 显示全部楼层
过段时间来看果然比上次看能看懂多一些了 虽然还是没全看懂  下次再来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-3 21:57:22 | 显示全部楼层
函数指针。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-3 22:02:53 | 显示全部楼层
解释器读到这样的修饰之后,会先解析@后的内容,直接就把@下一行的函数或者类作为@后边的函数的参数,然后将返回值赋值给下一行修饰的函数对象。这样解释下可能更清晰了吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-4 19:56:41 | 显示全部楼层
多谢分享!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 11:29:56 | 显示全部楼层
我仔细研究了一下,发现了一个事实,这个修饰符没什么卵用,如此名一样,修饰符,完就是修饰作用,换种说法就是粉饰或者盖头换面的感觉,我个人觉得这样不好,容易让人产生误会,尤其是识别编码的时候。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 11:34:07 | 显示全部楼层
delphi369 发表于 2015-1-22 20:34
我写了一个简单的装饰器:
def fun1(fx):
    fx(2,5)

这个不对哦
仔细看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-20 23:27:14 | 显示全部楼层
真看不出来,这功能到底有啥用啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-3 19:24:38 | 显示全部楼层
测试题:
0.        issubclass(class, classinfo)
1.        isinstance(object, class)
2.        hasattr(object, name)
3.        定义一个属性来定义其他属性
4.        x = property(getXSize, setXSize, delXSize)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 16:35:48 | 显示全部楼层
视频看懂了,来这里文章看晕了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 00:03:16 | 显示全部楼层
看不懂。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-13 23:20:12 | 显示全部楼层
涨见识
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-26 15:40:35 | 显示全部楼层
看不懂啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-28 15:26:23 | 显示全部楼层
看得不是很懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-29 02:27:51 | 显示全部楼层
完全看不懂,建议把不用装饰器的code也放上来,可以有个比较
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2017-8-5 13:16:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-8-7 14:15:49 | 显示全部楼层
hh
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-8-12 22:59:16 | 显示全部楼层
类共享的那块代码缩进有问题
然后总结一下装饰器的关键:
首先是方法共享,即把一个方法作为其他方法的附加功能
装饰器的使用与平时的方法调用不同,它需要以@+方法名 同时放在被'装饰'的方法的前面 这种形式
这样一来当被'装饰'的方法运行时,装饰方法也会运行
总的来说,要使用方法装饰器,需要形如:
  1. #coding=utf-8
  2. def fun_c(fun):
  3.     '''
  4.     #装饰器的名字随意,这里是fun_c,它需要有一个参数,用于指待调用这个装饰器的方法
  5.    
  6.     :param fun:
  7.     :return:
  8.     '''
  9.     def call():#这个方法名字也可以随意,当约定俗成为call,这个方法包含了装饰器方法的主体代码,同时参数方法混在里面
  10.         print 'A'
  11.         fun()#参数方法被夹在这里,我们都知道python代码是一行一行执行的,所以会先打印A,然后执行参数方法的代码,最后打印B
  12.         print 'B'
  13.     return call#必须把call方法返回,不然会提示None类型对象无法被调用,我想当被调用时,实际是这样执行的,fun_c(fun)(),所以当不是一个方法作为放回之的时候,就会产生

  14. @fun_c#装饰器要用的话就放在被装饰方法的前面
  15. def fun_a():
  16.     print 'C'

  17. fun_a()#有了装饰器的方法被执行的时候实际上执行的是fun_c(fun_c)()
复制代码

然后是类共享器:
  1. #coding=utf-8
  2. class A:
  3.     '''
  4.     类共享器的特性在旧式类也可以使用,现在使用的就是旧式类,装饰类需要在构造函数时将产生方法传入,同时被调用的方法必须名为
  5.     __call__
  6.     '''
  7.     def __init__(self,fun):#这里传入了参数方法fun
  8.         self.f=fun
  9.     def __call__(self):#这个函数的名字不能随便起,不信你试试
  10.         print 'A'
  11.         self.f()#然后参数方法就可以在这里被调用并执行
  12.         print 'B'

  13. @A
  14. def fun_a():
  15.     print 'C'

  16. fun_a()
复制代码

装饰器的作用是,当你需要经常讲函数代码的执行'夹在'一些相同代码的时候,这些相同代码你就可以提取出来做成装饰器,这样你就不用重复写一样的代码,而且很方便~

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
python2python + 3 + 3 + 2 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-8-17 11:14:02 | 显示全部楼层
http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
看了很多文章,这个最易懂,讲解了装饰器的语法和用处,大家可以参考一下,不过内置装饰器和total_ordering(cls)还不太懂,慢慢来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-26 01:05:28 | 显示全部楼层
看不懂,Hello.print_hello() 调用时为什么还是说Hello没有属性print_hello()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-14 06:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表