首页 > 代码库 > Python学习心得(六) 反射机制、装饰器

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‘)    

  

  

 

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