Python基础课:装饰器和闭包

#4.装饰器
#闭包
def fx(x):
    x += 1
    def fy(y):
        return x*y
    return fy

def f1(func):
    #print(‘f1 runing‘)
    def f2(y):
        print(‘f2 runing‘)
        return func(y) + 1
    return f2

def gun(m):
    print(‘gun runing‘)
    return m*m

#f1(gun)
#fg = f1(gun)
def fun(m):
    print(‘f2 runing‘)
    return gun(m) + 1
#fg(1)
#fun(1)

@f1
def deco(m):
    print(‘这是deco‘)
    return m*m  #这里通过装饰器的作用,实现给deco的返回值加 1 的功能

"""
打个比方,正常人都会穿鞋,但是呢有些人在鞋子里面就会放个增高鞋垫,这个增高鞋垫
不影响穿鞋子,但是呢会让穿的人看上去更高一点,装饰器就像这个增高鞋垫一样,
它不影响函数的正常使用,但是可以给函数增加更多的功能
"""
import time
def run_time(func):
    def new_fun(*args,**kwargs):
        t0 = time.time()
        print(‘star time: %s‘%(time.strftime(‘%x‘,time.localtime())) )
        back = func(*args)
        print(‘end time: %s‘%(time.strftime(‘%x‘,time.localtime())) )
        print(‘run time: %s‘%(round(time.time() - t0),4)
        return back
    return new_fun

@run_time
def test():
    for i in range(1,10):
        for j in range(1,i+1):
            print(‘%dx%d=%2s‘%(j,i,i*j),end = ‘ ‘)
        print ()

class Test_Class:
    def __init__(self,func):
        self.func = func

    def __call__(self):
        print(‘类‘)
        return self.func

@Test_Class
def fun_test():
    print(‘这是个测试函数‘)

#fun_test()()

#4.类装饰器
class Rectangle:
    def __init__(self,length,width):
        self.width = width
        self.length = length
    def area(self):       #实例方法
        areas = self.length * self.width
        return areas

    @property  #就像访问属性一样访问方法
    def fun(self):
        return self.width*self.length

    @staticmethod  #不用传self
    def func():
        print(‘staticmethod func‘)

    @classmethod
    def show(cls):
        print(cls)
        print(‘show fun‘)

e = Rectangle(3,4)
f = Rectangle(6,8)
时间: 2024-10-13 22:12:17

Python基础课:装饰器和闭包的相关文章

Python 函数装饰器和闭包

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 假如有个名为 decorate 的装饰器: @decorate def targ

python函数下篇装饰器和闭包,外加作用域

装饰器和闭包的基础概念 装饰器是一种设计模式能实现代码重用,经常用于查日志,性能测试,事务处理等,抽离函数大量不必的功能. 装饰器:1.装饰器本身是一个函数,用于装饰其它函数:2.功能:增强被装饰函数的功能. 装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数添加新功能后,不修改被装饰函数的调用方式 装饰器 = 高阶函数+函数嵌套+闭包 高阶函数 1.函数接受的参数是一个函数名 2.函数的返回值是一个函数名 3.只有上述条件满足一个就是高阶函数 def foo(

python函数装饰器

学习装饰器前提需要了解高阶函数,函数嵌套,函数闭包 python函数装饰器,顾名思义就是装饰函数,为函数添加新功能的的一种方式. 为什么要使用装饰器呢? 因为函数在运行时,如果不使用装饰器对函数进行功能添加,需要修改函数源代码,这样修改无疑会增加程序的冗余和复杂性,也不便于程序员对其进行修改.使用装饰器,可以在不改变函数源代码和调用方式的前提下,使用语法糖@装饰器,对函数功能进行添加. 装饰器本质上就是一个函数. 我们使用一个简单的例子来实现: import time #这是一个装饰器函数名为t

【转】详解Python的装饰器

原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def say_hello(): print "hello!" def say_goodbye(): print "hello!" # bug here if __name__ == '__main__':

Python 函数装饰器入门

原文链接: --> A guide to Python's function decorators Python功能强劲,语法表现力强,尤其装饰器深深的吸引着我.在设计模式中,装饰器可以在不使用子类的情况下,动态的改变函数,方法以及类的功能.这个功能非常有用,特别在你想扩展函数的功能同时又不想改变原有的函数.的确,我们任意的实现装饰器设计模式,但是,python通过提供简单的语法和特性让装饰器的实现变的如此简单. 在本文中,我将用一组例子来深入浅入python 函数装饰器的功能,所有的例子都是在

一篇文章让你明白python的装饰器

在看闭包问题之前先来看看关于python中作用域的问题 变量作用域 对于上述代码中出现错误,肯定没什么疑问了,毕竟b并没有定义和赋值,当我们把代码更改如下后: 再看一个例子: 首先这个错误已经非常明显:说在赋值之前引用了局部变量b 可能很多人觉得会打印10然后打印6,其实这里就是涉及到变量作用域的问题当Python编译函数的的定义体的时候,它判断b是局部变量,毕竟在函数中有b = 9表示给b赋值了,所以python会从本地环境获取b,当我们调用方法执行的时候,定义体会获取并打印变量a的值,但是当

函数装饰器和闭包(四)

上一章:函数装饰器和闭包(三) 单分派函数 假设我们现在要开发一个函数,这个函数可以传入一个元素,函数要判断元素的类型,再将其打印出来 from collections.abc import MutableSequence, MutableMapping def print_item(item): if isinstance(item, int): print("int:", item) elif isinstance(item, MutableSequence): print(&qu

Python学习---装饰器的学习1210

装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包  [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用:经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等应用场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用. 装饰器作用:装饰器感觉就像是内部函数的

详解Python的装饰器

Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def say_hello(): print "hello!" def say_goodbye(): print "hello!" # bug here if __name__ == '__main__': say_hello() say_goodbye() 但是在实际调用中,我们

进阶Python:装饰器 全面详解

进阶Python:装饰器 前言 前段时间我发了一篇讲解Python调试工具PySnooper的文章,在那篇文章开始一部分我简单的介绍了一下装饰器,文章发出之后有几位同学说"终于了解装饰器的用法了",可见有不少同学对装饰器感兴趣.但是那篇文章主要的目的是在介绍PySnooper,所以没有太深入的展开讲解装饰器,于是在这里就详细的介绍一些装饰器的使用. 装饰器是Python中非常重要的一个概念,如果你会Python的基本语法,你可以写出能够跑通的代码,但是如果你想写出高效.简洁的代码,我认