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学习心得(六) 反射机制、装饰器


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Python装饰器可以通过以下步骤进行: 1. 了解装饰器的概念和作用:装饰器是一种用于修改函数或类行为的函数或类。它可以在不修改原始函数或类的情况下,通过添加额外的功能来扩展其功能。 2. 学习装饰器的语法:装饰器可以使用函数或类来实现。使用函数实现装饰器时,需要使用`@`符号将装饰器应用于目标函数。使用类实现装饰器时,需要在类中定义`__call__`方法,并将装饰器应用于目标函数。 3. 掌握装饰器的常见应用场景:装饰器可以用于添加日志记录、性能统计、权限验证、缓存等功能。了解这些应用场景可以帮助你更好地理解装饰器的实际用途。 4. 阅读相关文档和教程:有很多优秀的教程和文档可以帮助你深入学习Python装饰器。你可以阅读Python官方文档中关于装饰器的部分,也可以搜索一些优质的博客或教程来学习。 5. 实践编写装饰器:通过编写一些简单的装饰器来加深对装饰器的理解。可以从一些简单的装饰器开始,逐渐扩展到更复杂的装饰器。 以下是一个使用类中的方法作为装饰器的示例[^2]: ```python class Decorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): # 在函数执行前添加额外的功能 print("Before function execution") # 调用原始函数 result = self.func(*args, **kwargs) # 在函数执行后添加额外的功能 print("After function execution") return result @Decorator def target_function(): print("Inside target function") # 调用被装饰的函数 target_function() ``` 这个示例中,`Decorator`类定义了一个装饰器,它在被装饰的函数执行前后添加了额外的功能。通过将`@Decorator`应用于`target_function`,`target_function`就被`Decorator`装饰器修饰了。当调用`target_function`时,装饰器的功能会被触发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值