python学习笔记之——装饰器及对象

1、反射之__import__

我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工作的。
        在一些程序中,我们可以动态地去调用函数,如果我们知道模块的名称(字符串)的时候,我们可以很方便的使用动态调用。

__import__(module_name[, globals[, locals[, fromlist]]]) #可选参数默认为globals(),locals(),[]
__import__(‘os‘)    
__import__(‘os‘,globals(),locals(),[‘path‘,‘pip‘])  #等价于from os import path, pip



例: 以字符串的形式导入模块

mod = __import__(‘sys‘)
print(mod.path)

例:以字符串的形式调用模块中的函数

func = getattr(mod,‘path‘)
print(func)



例:从一个包中导入一个模块 ,包名为main,模块名为mod

aa = __import__(‘main.mod‘)

aa = __import__(‘main‘, globals={}, locals={}, fromlist=[‘mod‘])

aa = __import__(‘main‘,globals(),locals(),[‘mod‘])

m = getattr(aa, ‘mod‘)
print(m.first(‘kevin‘))

n = getattr(m, ‘first‘)
print(type(n))
n(‘kevin‘)



注:web框架中根据不同的URL,来加载不同的模块,进行不同的处理。

2、装饰器

装饰器的语法以@开头,接着是装饰器要装饰的函数的申明等。
       其实总体说起来,装饰器其实也就是一个函数,一个用来包装函数的函数,装饰器在函数申明完成的时候被调用,调用之后申明的函数被换成一个被装饰器装饰过后的函数。

当原函数有形参时,在装饰的函数中也需要有相应的形参func(args);

当原函数有return返回值时,在装饰的函数中也必须有returne func(args);

装饰器分为无参装饰和有参装饰:

★无参装饰
定义方法如下:
比如先定义一个装饰方法:



def deco(func):
    """无参数调用decorator声明时必须有一个参数,这个参数将接收要装饰的方法"""
    print(‘第一个装饰器‘)          #进行额外操作
    return func                        #返回一个可调用对象(此例还是返回作为输入参数的方法),返回一个新函数时,新函数可以是一个全局方法或者decorator函数的内嵌函数,只要函数的签名和被装饰的函数相同

@deco
def MyFunc(args):                 #应用@deco修饰的方法
    print(‘my first decorator‘,args)

return(‘nihao‘,args)

MyFunc(‘wangkai‘)                 #调用被装饰的函数
MyFunc(‘kevin‘)

info = MyFunc(‘gonghui‘)
print(info)

        注意:当使用上述方法定义一个decorator方法时,函数体内的额外操作只在被装饰的函数首次调用时执行;



       如果要保证额外操作在每次调用被装饰的函数时都执行,需要换成如下的写法:
def deco(func):
    def replaceFunc(args):     #定义一个内嵌函数,此函数包装了被装饰的函数,并提供额外操作的代码
        print(‘第一个装饰器‘)     #进行额外操作
        return func(args)          #产生对被装饰函数的调用
    return replaceFunc           #由于返回的是这个新的内嵌函数,所以确保额外操作每次调用得以运行

@deco
def MyFunc(args):                 #应用@deco修饰的方法
    print(‘my first decorator‘,args)
    return(‘nihao‘,args)

MyFunc(‘wangkai‘) #调用被装饰的函数
MyFunc(‘kevin‘)
info = MyFunc(‘gonghui‘)
print(info)



有参装饰:



def decoWithArgs(arg):
    """由于有参数的decorator函数在调用时只会使用应用时的参数而不接收被装饰的函数做为参数,
       所以必须返回一个decorator函数, 由它对被装饰的函数进行封装处理"""
    def newDeco(func):                          #定义一个新的decorator函数
        def replaceFunc(args):                 #在decorator函数里面再定义一个内嵌函数,由它封装具体的操作
            print(‘第一个装饰器‘)                 #进行额外操作
            aa = func(args)                        #对被装饰函数进行调用

print(‘再见‘)

return aa
        return replaceFunc
    return newDeco                                #返回一个新的decorator函数

@decoWithArgs("demo")
def MyFunc(args):                                 #应用@decoWithArgs修饰的方法
    print(‘my first decorator‘,args)   
    return(‘nihao‘,args)

MyFunc(‘wangkai‘)                                #调用被装饰的函数
MyFunc(‘kevin‘)
info = MyFunc(‘gonghui‘)
print(info)



当我们对某个方法应用了装饰方法后, 其实就改变了被装饰函数名称所引用的函数代码块入口点,使其重新指向了由装饰方法所返回的函数入口点。由此我们可以用decorator改变某个原有函数的功能,添加各种操作,或者完全改变原有实现。

时间: 2024-08-06 11:51:21

python学习笔记之——装饰器及对象的相关文章

python学习笔记(五):装饰器、生成器、内置函数、json

这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰

python学习笔记:装饰器2

python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 直接举例: import datetime def func_name(func):#定义一个装饰函数,接受一个函数对象作为参数(也就是被装饰的函数) def wrap():#包装函数 print("Function name:%s"%(func.__name__)) func() #执行目标函数 return wrap #返回包装函数 @func_name #等于 func_time = func_n

Python学习笔记012——装饰器

1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函数,函数装饰类,类装饰函数,类装饰类(两者不是一一对应关系,其实我也不知道他们之间是什么样的对应关系) 一般而言,主要应用的是函数装饰函数 1.3 装饰器本质 本质上,decorator就是一个返回函数的高阶函数. 在面向对象(OOP)的设计模式中,decorator被称为装饰模式.OOP

python学习笔记之装饰器(语法糖)

什么是装饰器 装饰器的知识点铺垫(函数即变量,高阶函数,嵌套函数) 不带参数的装饰器示例 带参数的装饰器示例 作业 一.什么是装饰器 本质上,装饰器就是返回一个函数的高阶函数.装饰器就是一个函数 装饰器的原则: 不修改被装饰对象的源代码 不修改被装饰对象的调用方式 二.装饰器涉及的知识点 函数即变量 高阶函数 嵌套函数 函数即变量: 在python中,一个变量首先被定义,分配内存空间,然后再使用. 以x=1,这个简单的赋值语句为例子.首先在内存中分配一个空间,x指向该内存空间,该内存空间内存入"

Python学习笔记_Chapter 6定制数据对象

1. 有用的BIF a. 判断字符串中是否包含子字符串 1 if s_a in s_b: b. pop() 描述:从指定的列表位置删除并返回一个数据项. 1 (sarah_name,sarah_dob)=l_rah.pop(0),l_rah.pop(0) 2 #pop(0)中0位置为list中第一个数据项 3 #第一次执行pop赋值给sarah_name c. strip() 输入的是字符串,返回的是列表 d.open 读文件时可以多种方式打开文件,取出的数据是不同的,可以是文本也可以是二进制.

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

python学习笔记4--装饰器、生成器、迭代器、匿名函数、内置方法、数据序列话

一.装饰器 1.意义:当需要给程序中某些函数新增某项功能时,为了避免直接修改函数源代码和函数调用方式,所以引入装饰器. 2.定义:装饰器用于装饰其他函数,就是为其他函数提供附加功能. 3.原则: 1)不修改被装饰的函数的源代码 2)不修改被装饰的函数的调用方式 4.装饰器储备知识: 1)函数即变量 2)高阶函数 a.把函数当做参数传递给另一个函数(在不修改被修饰函数源代码的情况下为该函数添加功能) b.返回值中包含函数名(在不修改被修饰的函数的调用方式的情况下为该函数添加功能) 3)嵌套函数:在

从零开始的Python学习Episode 11——装饰器

装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 1 import time 2 3 def show_time(f): 4 def inner(): 5 start = time.time() 6 f() 7 end = time.time() 8 print('time: %s'%(end-start)) 9 return inner 10 11 @show_time 12 def fun1(): 13 p

python学习笔记4--迭代器、生成器、装饰器、递归

迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁.这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问