zoukankan      html  css  js  c++  java
  • 【Python入门学习】闭包&装饰器&开放封闭原则

    1. 介绍闭包

    闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure)

    例如:如果在一个内部函数里:func2()就是内部函数,

    对在外部作用域的变量进行引用:n就是被引用的遍历,n在外部作用域func里面被定义,而不是全局作用域

      1 def func():
      2     n = 10
      3     def func2():
      4         print('func2', n)
      5     return func2
      6 
      7 f = func()
      8 f()
      9 
    View Code

    2. 介绍装饰器

    装饰器:本质上是一个闭包函数。

    功能:在不修改原函数的及其调用方式的情况下对原函数进行功能扩展。这个特点正好满足软件开发原则:开放封闭原则

    练习:请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:

      1 import time
      2 import functools
      3 
      4 def metric(fn):
      5     @functools.wraps(fn)
      6     def wrapper(*args, **kwargs):
      7         start = time.time()
      8         ret = fn(*args, **kwargs)
      9         end = time.time()
     10         print('%s executed in %s ms' % (fn.__name__, end - start))
     11         return ret
     12     return wrapper
     13 
     14 @metric
     15 def fast(x, y):
     16     time.sleep(0.0012)
     17     return x + y
     18 
     19 @metric
     20 def slow(x, y, z):
     21     time.sleep(0.1234)
     22     return x * y * z
     23 
     24 f = fast(11, 22)
     25 s = slow(11, 22, 33)
     26 if f != 33:
     27     print('测试失败!')
     28 elif s != 7986:
     29     print('测试失败!')
    View Code

    3. 运用装饰器遵循开放封闭原则

    开放:对拓展是开放的

        为什么要对扩展开放呢?

        我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

    封闭:对修改是封闭的

        为什么要对修改封闭呢?

        就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

    装饰器完美的遵循了这个开放封闭原则。

    例子:拷贝alex的网站登录

      1 login_status = False
      2 def login(func):
      3     def login_inner(*args, **kwargs):
      4         _user = 'alex'
      5         _pwd = 'abc123'
      6         global login_status
      7         if login_status == False:
      8             user = input('User Name:')
      9             password = input('Password:')
     10             if user == _user and password == _pwd:
     11                 login_status = True
     12                 print('成功登录...')
     13             else:
     14                 print('用户名和密码错误')
     15         else:
     16             print('用户已经登录,验证通过')
     17         if login_status:
     18             func(*args, **kwargs)
     19     return login_inner
     20 
     21 def home():
     22     print('---首页---')
     23 def henan():
     24     print('---河南专区---')
     25 @login
     26 def hebei(type):
     27     print('---河北专区---', type)
     28 hebei = login(hebei)
     29 hebei("3p")
    View Code
  • 相关阅读:
    jquery.validate.js【简单实用的表单验证框架】
    velocity.js实现页面滚动切换效果
    站在巨人的肩膀上——制作酷炫web幻灯片
    简单说说随机打乱数组的方法
    JS数据结构之BinarySearchTree
    做一个extjs的扩展
    【OneAPM】极客编程挑战#025:发挥想象生成漂亮炫酷的SVG动画效果
    将博客搬至CSDN
    练习作品7:批量做字库 识别码
    联系作品6 模版打印 奖状
  • 原文地址:https://www.cnblogs.com/yongqiangyue/p/8820103.html
Copyright © 2011-2022 走看看