博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器 未完待续。。。
阅读量:6498 次
发布时间:2019-06-24

本文共 2546 字,大约阅读时间需要 8 分钟。

装饰器:

定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能。

原则:  1.不能修改被装饰的函数的源代码

    2.不能修改被装饰的函数的调用方式

'''

def logger():

  print('logging')

def test1():

  pass

  logger()

def test2():

  logger()

test1()

test2()

'''

 

import time

def timmer(func):

  def warpper(*args,**kwargs):

    start_time=time.time()

    func()

    stop_time=time.time()

    print('the func run time is %s '%(stop_time-start_time))

  return warpper

@timmer

  

def test1():

  time.sleep(3)

  print('in the test1')

 

test()

实现装饰器知识储备:

1.函数即‘变量’

def bar():

  print('in the bar')

def foo():

  print('in the foo')

  bar()

foo()

 

 

def foo():

  print('in the foo')

  bar()

def bar():

  print('in the bar')

foo()

#  第一步 定义  第二步 调用

2.高阶函数

  a:把一个函数名当做实参,传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)

  b:返回值中包含函数名

 

a:

import time

def bar():

  time.sleep(3)

  print('in the bar')

 

def test1(func):

  start_time=time.time()        

  func()   #run bar

  stop_time=time.time()

  print('the func run time is %s'%(stop_time-start_time))

test1(bar)

func=bar

func()

  b:返回值中包含函数名  (函数是变量)(不修改函数的调用方式)

import time

def bar():

  time.sleep(3)

  print('in the bar')

def test2(func):

  print(func)

  return func

#print(test2(bar))

 

t=test2(bar)#是把bar的内存地址传给变量

bar=test2(bar)

#print(t)

t()

bar()# run bar

#如果是test2(bar())  这个是把bar的返回值传给变量 不符合高阶函数的定义

 

3.嵌套函数

def foo():

  def bar():

    print('in the bar')

  bar()

foo()

 

'''def test1():

  test2()

test1()'''      这个是函数的调用      

 

高阶函数+嵌套函数=>装饰器

 

补充:

局部作用域和全局作用域的访问顺序

x=0#全局变量

def grandpa()

  #x=1

  def dad():

    x=2 

    def son():

      x=3

      print x

    son()

  dad()

grandpa()

 

打印结果为3

就近找值 ,从里往外找。

 

 

import time

def timer(func)         # timer(test1)   func=test1

  def deco():

    start_time=time.time()

    func()

    stop_time=time.time()

    print('the func run time is %s'%(stop_time - start_time))

  return deco

#def timer():

#  def deco():

#    pass

 

def test1():

  time.sleep(3)

  print('in the test1')

 

def test2();

  time.sleep(3)

  print('in the test2')

 

test1=timer(test1)

test1()  #====>deco()

#test1=deco(test1)

#deco(test2)

 

这块老师讲的 我没理解了  这个代码也是贴的是进行中代码   最终代码:

import time def timer(func): #timer(test1)  func=test1     def deco(*args,**kwargs):         start_time=time.time()         func(*args,**kwargs)   #run test1()         stop_time = time.time()         print("the func run time  is %s" %(stop_time-start_time))     return deco @timer  #test1=timer(test1) def test1():     time.sleep(1)     print('in the test1') @timer # test2 = timer(test2)  = deco  test2(name) =deco(name) def test2(name,age):     print("test2:",name,age) test1() test2("alex",22) 待理解再继续写。。。。

转载于:https://www.cnblogs.com/ugfly/p/7246713.html

你可能感兴趣的文章
[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt
查看>>
2016.8.11 DataTable合并及排除重复方法
查看>>
php 魔术方法 说明
查看>>
Mysql
查看>>
Pycharm开发环境设置与熟悉。
查看>>
前端面试官,我为什么讨厌你。
查看>>
航电1012 u Calculate e
查看>>
netty支持SSL,OpenSSL
查看>>
Yii简单的基于角色的访问控制
查看>>
POJ-1860-Currency Exchange
查看>>
跨越企业的“中等收入陷阱”
查看>>
Android 开发者必知的开发资源
查看>>
jackson 常见问题
查看>>
软件工程技术基础-(软件复用技术)
查看>>
给django视图类添加装饰器
查看>>
对javscript中Object.defineProperty的理解
查看>>
.vimrc文件
查看>>
DVWA默认用户名密码
查看>>
简述 clearfix 的原理
查看>>
swift轮播图代码
查看>>