码迷,mamicode.com
首页 > 编程语言 > 详细

Python的反射

时间:2018-08-18 19:39:40      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:djang   __name__   UNC   coding   概念   参数   引入   else   self   

什么是反射

反射是一个很重要的概念,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有三个重要的方法:

  • getattr
  • setattr
  • hasattr

反射常常用在动态加载模块的场景中。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: rex.cheny@outlook.com

class TestObj(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def displayName(self):
        print("displayName方法执行,打印姓名:", self.name)



def AAA(self):
    print("I am AAA.")


def main():
    to = TestObj("Tom", 23)
    # 查看 to 实例里面是否有 name 这个属性
    if hasattr(to, "name"):
        print("实例 to 中有 name 属性。")
        print(getattr(to, "name"))
    else:
        print("实例 to 中没有 name 属性。")

    if hasattr(to, "displayName"):
        print("实例 to 中有 displayName 属性。")
        getattr(to, "displayName")()
    else:
        print("实例 to 中没有 displayName 属性。")

    if hasattr(to, "AAA"):
        print("实例 to 中有 AAA 属性。")
        getattr(to, "AAA")()
    else:
        print("实例 to 中没有 AAA 属性,将会设置。")
        setattr(to, "AAA", AAA)  # 参数:实例、方法名称、具体方法

        # to.AAA(to)  # 这里一定要主动传递一个实例进去,因为它不会自动装配self
        getattr(to, "AAA")(to)


if __name__ == __main__:
    main()

AAA是动态装载到实例里面去的。

技术分享图片

反射使用

通过字符串导入模块

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: rex.cheny@outlook.com

temp = "re"
model = __import__(temp)


def main():
    txt = "hj123uo"
    pattern = model.compile(r"[0-9]+")
    print(model.search(pattern, txt).group())


if __name__ == __main__:
    main()

技术分享图片

以字符串的形式使用模块的方法

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: rex.cheny@outlook.com
 
temp = "re"  # 要引入的模块
func = "compile"  # 要使用的方法
model = __import__(temp)  # 导入模块
function = getattr(model, func)  # 找到模块中的属性


def main():
    txt = "hj123uo"
    pattern = function(r"[0-9]+")  # 这里执行funcation()就等于执行re.compile()函数
    print(model.search(pattern, txt).group())


if __name__ == __main__:
    main()

技术分享图片

反射到底有什么用?

上面使用re.compile()函数的整个过程看起来很麻烦,但是你要知道这就等于实现了动态加载和执行所需要的模块或方法而不需要全部写入到PY文件中,当然具体需要执行的方法你也要提前实现。典型的使用场景就是web的URL路由。目前所有的web框架的URL路由基本都是这个原理。
用户输入不同的URL如何加载不同的PY文件以及调用里面的方法呢?你想一想Django里面,它并不是这样的,它依然需要你设置URL以及该URL对应的PY文件,为什么?因为这样调试方便,当然你能力足够也可以给它改写成反射的机制。

Python的反射

标签:djang   __name__   UNC   coding   概念   参数   引入   else   self   

原文地址:https://www.cnblogs.com/yunxizhujing/p/9498091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!