鱼C论坛

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

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

  [复制链接]
发表于 2017-8-26 13:54:31 | 显示全部楼层
看了半天没看懂 结果一百度才懂: 实际上就是说
一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-26 14:09:54 | 显示全部楼层
   def 函数1(函数):
       函数1的函数体

   @函数名1               
    def 函数2():
        函数2的函数体

    >>>函数名2()
             ↑把函数2作为参数传入函数1, 并执行函数1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-26 14:24:06 | 显示全部楼层
这是我的理解方法:
class 类1():
    def __init__(self,func):
        (构造函数的函数体)

@类1
def 函数1():
    函数体

>>>函数1()   #调用函数1
          ↑实际效果: 把函数1作为 类1.__init__( ) 的参数传入, 并执行
                         即 把 整个函数1 作为类1的构造函数的参数 来执行类1的初始化(__init__()方法)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-2 07:06:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-8 17:45:15 | 显示全部楼层
老师最后的例子代码缩进不大好?

应该如下:
class Hello:
  @classmethod
  def print_hello(cls):
      print("Hello")

也还是写在类里面的。。。。不是很明白和直接在类里面写有什么区别。 难道就只是加了修饰符之后多了一个不用绑定实例就可以调用方法的功能?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 22:01:25 | 显示全部楼层
甲鱼,你这个代码的缩进不对吧,望查证修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 17:46:50 | 显示全部楼层
其实就是用@timeslong 下面的函数f()来替换timeslong里面的func()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-19 19:15:32 | 显示全部楼层
实在对0基础不友好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-29 17:27:14 | 显示全部楼层
fuc,这个当做参数表示什么意思,不能直接help(func),虽然知道这个应该是function的缩写,但是作以它作为参数感觉挺尴尬的,但是第三个例子有缩进问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-29 17:31:30 | 显示全部楼层
感觉func表示的是一种标识,这个自动在方法开始时调用前半段并且让结束时调用后段。感觉就像是吧修饰的方法直接插入到func的位置,然后线性执行的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-5 16:53:32 | 显示全部楼层
看了第二遍,突然豁然开朗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-13 11:00:43 | 显示全部楼层
大概理解了一些,也没完全懂。但是能感觉出来这个用处很大。
下面模拟了一个场景:
def check(fn):
    admins = ["admin","sys","sysadmin"]
    def checkargs(user, argument):
        if user not in admins:
            print("用户: %s, 无权限执行[%s]操作!" % (user,argument))
        else:
            print("验证成功!")
            return fn(user, argument)
    return checkargs

@check
def test(name,args):
    print("%s 开始执行%s任务..." % (name,args))

test("admin","select")
test("小明","select")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-30 16:37:40 | 显示全部楼层
import time

def timeslong(func):   
    def call():
        start = time.clock()
        print("It's time starting ! ")
        func()
        print("It's time ending ! ")
        end = time.clock()
        return "It's used : %s ." % (end - start)
    return call
   

@timeslong
def f():
    y = 0
    for i in range(10):
        y = y + i + 1
        print(y)
    return y

print(f())
运行结果:

It's time starting !
1
3
6
10
15
21
28
36
45
55
It's time ending !
It's used : 0.15272174221359658 .


我的理解如下,不知对不对,分为两步:
1. f()函数作为参数,传递到timeslong(func)中
2. 在timeslong()中把call()函数返回给f(),在这一步中等于是用call()替换了f()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-4 18:39:26 | 显示全部楼层
装饰器 decorator或者称为包装器,是对函数的一种包装。
它能使函数的功能得到扩充,而同时不用修改函数本身的代码。
它能够增加函数执行前、执行后的行为,而不需对调用函数的代码做任何改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 22:49:26 | 显示全部楼层
import time

class timeslong:
    def __init__(self,func):
        self.f = func
    def __call__(self):
        start = time.clock()
        print("It's time starting ! ")
        self.f()
        print("It's time ending ! ")
        end = time.clock()
        return "It's used : %s ." % (end - start)

@timeslong
def f():
    y = 0
    for i in range(10):
        y = y + i + 1
        print(y)
    return y

print(f())
g=timeslong(f)
g()

#这个程序在运行g()的时候,会把it’s time starting和 it’s time ending这句话打两遍,不知道为什么?  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-15 10:35:48 | 显示全部楼层
第二大段程序勘误:
1.没有引进 import time
2.声明类的首字母要大写
3.缩进问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-23 10:40:12 | 显示全部楼层
早起的达仙僧 发表于 2017-3-19 10:51
一开始的例子可以写成这样啊,没看懂为什么要用装饰器

我也是这么觉得,感觉修饰符有点脱裤子放屁,多此一举!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-3 19:41:36 | 显示全部楼层
完全看不懂,为什么不专门讲一节课
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-3 19:54:09 | 显示全部楼层
看了大家的回复,没有搞懂的人占多数,那么长时间都没有细致地讲一下,看来小甲鱼对装饰器这个东西也是含含糊糊,没办法讲清楚吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-6 10:53:33 | 显示全部楼层
def call()
return call()
这个嵌套有点多余啊,请问有什么作用吗?不写也不影响。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 06:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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