zoukankan      html  css  js  c++  java
  • python-装饰器

    在java中有个面向切面编程,在python中也有个类似的东西,那就是装饰器

    使用装饰器前,先熟悉下闭包:

    • 闭包是指延伸了作用域的函数,在其中能够访问未在函数定义体中定义的非全局变量。
    • 未在函数定义体中定义的非全局变量一般都是在嵌套函数中出现的。
    """
    闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。
    """
    
    
    def out(a):
        b = 5
    
        def inner():
            print(a + b)
    
        return inner
    
    
    if __name__ == '__main__':
        demo = out(5)  # 内函数的引用返回给了demo
        # demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
        demo()

    python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。

    """
    装饰器:
        使用函数装饰器 A() 去装饰另一个函数 B(),其底层执行了如下 2 步操作:
        将 B 作为参数传给 A() 函数;
        将 A() 函数执行完成的返回值反馈回  B。
    """
    
    
    def funA(fn):
        print("python")
        fn()
        print("www.python.com")
        return "装饰器函数的返回值"
    
    
    @funA
    def funB():
        print("Java")
    
    
    c = funB
    print(c)  # 装饰器函数的返回值

    装饰器应用的小案例

    import time
    
    
    def out(func):
        def inner(a, b):
            print("装饰器开始装饰...")
            start_time = time.time()
            func(a, b)
            end_time = time.time()
            s = (end_time - start_time) * 1000
            print("time is %d ms" % s)
    
        return inner
    
    
    @out
    def func_1(a, b):
        print("--- 加法 ---")
        time.sleep(1)
        print("result is %d" % (a + b))
    
    
    @out
    def func_2(a, b):
        print("--- 减法 ---")
        time.sleep(1)
        print("result is %d" % (a - b))
    
    
    if __name__ == '__main__':
        f1 = func_1
        f1(5, 2)
    
        f2 = func_2
        f2(6, 3)

    Python内置装饰器

    在Python中有三个内置的装饰器,都是跟class相关的:staticmethod、classmethod 和property。

    • staticmethod 是类静态方法,其跟成员方法的区别是没有 self 参数,并且可以在类不进行实例化的情况下调用
    • classmethod 与成员方法的区别在于所接收的第一个参数不是 self (类实例的指针),而是cls(当前类的具体类型)
    • property 是属性的意思,表示可以通过通过类实例直接访问的信息

    示例:property的使用

    """
    新式类@property的使用
    """
    
    
    class Goods(object):
        def __init__(self):
            # 初始化原价与折扣
            self.org_price = 1000;
            self.discount = 0.7
    
        # 获取价格的方法
        @property
        def price(self):
            return self.org_price * self.discount
    
        # 设置价格的方法
        @price.setter
        def price(self, data):
            self.org_price = data
    
        # 删除价格的方法
        @price.deleter
        def price(self):
            print("执行deleter方法")
    
    
    goods = Goods()
    # goods.price ==> goods.price()
    print(goods.price)
    # goods.price ==> goods.price(600)
    goods.price = 600
    print(goods.price)
    # goods.price ==> goods.price()  --> @price.deleter装饰的方法
    del goods.price
  • 相关阅读:
    RxJava+okhttp3
    RetrofitOkHttp网络请求
    布局111
    网络请求展示数据
    一级列表展示购物车
    终极MVP二级购物车
    将博客搬至CSDN
    nyoj-开灯问题
    nyoj-数乌龟
    nyoj 正三角形的外接圆面积
  • 原文地址:https://www.cnblogs.com/wakey/p/13291878.html
Copyright © 2011-2022 走看看