Python学习心得(六) 反射机制、装饰器

1.反射机制

#/usr/bin/env python
# -*- coding:utf-8 -*-
‘‘‘

Python反射机制的核心本质:利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动

通俗讲就是通过用户传入url的不同,调用不同的模块函数,好多比较流行的web框架都是通过反射的机制,根据url的不同指向不同的模块

getattr(),hasattr(),setattr(),delattr()对模块的修改都在内存中进行,并不会影响文件中的真实内容    

‘‘‘

def run_reflect():
    #以 模块/函数 的形式接收传参
    getstr = raw_input(‘请输入执行路径:‘)

    #把模块和函数拆分
    modulestr,funstr = getstr.split(‘/‘)

    try:
        #以字符串的形式导入模块
        module = __import__(modulestr)

        #hasattr()内置函数判断模块对象中是否存在属性或方法
        if hasattr(module,funstr):
            #getattr()获取模块对象的属性或方法
            func = getattr(module, funstr)
            #执行方法
            func()
        else:
            print ‘模块<‘ + modulestr + ‘>中不存在‘ + funstr + ‘属性或方法!‘

        #setattr(对象,字符串,任意值) 设置对象属性值
        setattr(module, ‘setAttrValue‘, 123)    

        #判断刚设置的属性是否存在,存在为True,否则False
        print hasattr(module, ‘setAttrValue‘) #打印结果:True

        #以字符串的形式删除对象的属性
        delattr(module, ‘setAttrValue‘)
        print hasattr(module, ‘setAttrValue‘) #打印结果:False

    except ImportError,e:
        print ‘module对象<‘ + modulestr + ‘>不存在 && e:‘ + e

if __name__ == ‘__main__‘:
    run_reflect()

- 引用测试的reflect_path1/foo1 模块/函数

#/usr/bin/env python
# -*- coding:utf-8 -*-

from pprint import pprint #打印的增强版

class test1():
    commonattr = ‘binguo‘
    def innerfun(self):
        print ‘innerfun‘

def foo1():
    dict = {‘uid‘:‘20170806‘,‘info‘:‘reflect test‘}
    pprint(dict)

2.装饰器  

#/usr/bin/env python
# -*- coding:utf-8 -*-
‘‘‘
装饰器:用于对函数或类的代码的封装

由于函数在Python中是作为一级对象的存在,因此它们能够像其他对象一样被传递到另一个函数。
装饰器就是接受另一个函数作为参数,并用其完成一些操作的函数。

装饰器的应用是通过在装饰器的名称前放置一个@字符,并在被装饰函数声明之上添加一行实现的。

需要注意的一点是:对于某个可调用的函数,可以使用多个装饰器,多个装饰器需要按照自底向上的顺序来应用它们。

#内置的装饰器有三个,分别是@staticmethod、@classmethod和@property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。

详见下:

‘‘‘

#无参情况
def decorator1(fun):
    def innerdef():
        print ‘before decorator‘ #函数运行前处理常见的前置条件(如确认授权)
        fun() #实际装饰器要封装的无参函数
        print ‘after decorator‘ #函数处理后确保清理(如输出异常处理)
    return innerdef   

#有参情况
def decorator2(fun): #装饰器可将函数注册到信号系统或注册到web应用程序的url注册表中,总之很有用,以后用的到
    def innerdef(args):
        print ‘args:before decorator‘
        fun(args) #实际装饰器要封装的有参函数
        print ‘args:after decorator‘
    return innerdef   

@decorator1
#无参函数应用装饰器
def foo2():
    print ‘function foo2‘ 

@decorator2
#有参函数应用装饰器
def foo3(argsvalue):
    print ‘function foo3‘ + ‘\t\t‘ + ‘argsvalue:‘ + argsvalue      

foo2()
foo3(‘when input args‘)

  

  

时间: 2024-10-26 12:34:25

Python学习心得(六) 反射机制、装饰器的相关文章

Python学习笔记__4.4章 装饰器(添加额外功能)

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 装饰器可以帮助我们为已经存在的对象添加额外的功能 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 装饰器经常用于有切面需求的场景,比如:插入日志.性能测试.事物处理.缓存.权限校验等场景. 1.1.为now函数 加一行日志 # 定义now函数 def now(): print('2018-5-8') # 编辑decorator def log(func):

Python学习笔记(十一)装饰器

摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000#0 本文章完全用来个人复习学习,侵删: 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25') ... >

python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: 1 >>> g = (x * x for xin range(10)) 2 >>> g3 <generator object <genexpr> at 0x1022ef630> 此处g就是一个生成器. 迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是gene

python学习笔记-(八)装饰器、生成器&amp;迭代器

本节课程内容概览: 1.装饰器 2.列表生成式&迭代器&生成器 3.json&pickle数据序列化 1. 装饰器 1.1 定义: 本质上是个函数,功能是装饰其他函数—就是为其他函数添加附加功能 1.2 装饰器原则: 1)  不能修改被装饰函数的源代码: 2)  不能修改被装饰函数的调用方式: 1.3 实现装饰器知识储备: 1.3.1 函数即“变量” 定义一个函数相当于把函数体赋值给了函数名 变量可以指向函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Python学习笔记(2)装饰器

1,.概念 装饰器英文名Decorator,装饰器的作用就是为已经存在的对象添加额外的功能.总的来说,装饰器其实就是一个函数,一个用来包装函数的函数,所以他的参数是被修饰的函数对象,返回一个修改之后的函数对象,将其重新赋值原来的标示符,并永久丧失对原始函数对象的访问. 2.装饰器语法 1.def deco(func): 2. print func 3. return func 4[email protected] 5.def foo():pass 6.foo() 第一个函数deco是装饰函数,它

python学习day07 高阶函数 装饰器 语法糖

语法糖对于计算机的运行并没有任何的好处,但是对于程序员的好处是很大的,方便我们写代码,所以称为糖 #******************************装饰器************************* # 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. # 装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景 import time def func1(): print('in f

Python学习笔记(yield与装饰器)

yeild:返回一个生成器对象: 装饰器:本身是一个函数,函数目的装饰其他函数(调用其他函数) 功能:增强被装饰函数的功能 装饰器一般接受一个函数对象作为参数,以便对其增强 @原函数名  来调用其他函数 递归:递归需要边界条件,递归前进段和递归返回段: 10*9*8*7*6*5*4*3*2*1 10*9 10*(10-1)*(10-1)-1) 协程: 函数的设计规范: 耦合性: (1)通过参数接受输入,以及通过return产生输出以保证函数的独立性: (2)尽量减少使用全局变量进行函数间通信:

Python学习笔记(12)装饰器

import time def show_time(f): def inner(a, b): start = time.time() f(a, b) end = time.time() print('spend %s' % (end - start)) return inner @show_time # add = show_time(add)def add(a, b): print(a + b) time.sleep(1) add(3, 4) import timeimport functoo

java反射机制学习:初始反射机制

本人小白一枚,想和大家一起分享我学习java的笔记和心得. 反射机制: 指的是可以于运行时加载.探知.使用编译期间完全未知的类. 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: Class clazz = Class.forName(com.danchel.reflect.User); 加载完类之后,在堆内存中,就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象