Python反射

反射的定义

根据字符串的形式去某个对象中操作成员

  1. 根据字符串的形式去一个对象中寻找成员
  2. 根据字符串的形式去一个对象中设置成员
  3. 根据字符串的形式去一个对象中删除成员
  4. 根据字符串的形式去一个对象中判断成员是否存在

初始反射

通过字符串的形式,导入模块

根据用户输入的模块名称,导入对应的模块并执行模块中的方法

  1. # Python使用的是3.5.1
  2. [[email protected] ~]# python -V
  3. Python 3.5.1
  4. # commons.py为模块文件
  5. [[email protected] ~]# ls
  6. commons.py  reflection.py
  7. # commons.py文件内容
  8. [[email protected] ~]# cat commons.py
  9. #!/usr/bin/env python
  10. # 定义了连个函数,f1和f2
  11. def f1():
  12.    return "F1"
  13. def f2():
  14.    return "F2"
  15. [[email protected] ~]# cat reflection.py
  16. #!/usr/bin/env python
  17. # _*_ coding:utf-8 _*_
  18. # 输入模块的名称
  19. mod_name = input("请输入模块名称>>> ")
  20. # 查看输入的内容及数据类型
  21. print(mod_name, type(mod_name))
  22. # 通过__import__的方式导入模块,并赋值给dd
  23. dd = __import__(mod_name)
  24. # 执行f1()函数
  25. ret = dd.f1()
  26. # 输出函数的返回值
  27. print(ret)
  28. # 执行reflection.py
  29. [[email protected] ~]# python reflection.py
  30. # 输入模块名称
  31. 请输入模块名称>>> commons
  32. # 返回输入的内容及数据类型
  33. commons <class ‘str‘>
  34. # 执行F1函数
  35. F1

通过字符串的形式,去模块中寻找指定函数,并执行

用户输入模块名称和函数名称,执行指定模块内的函数or方法

  1. [[email protected] ~]# cat commons.py
  2. #!/usr/bin/env python
  3. def f1():
  4.    return "F1"
  5. def f2():
  6.    return "F2"
  7. [[email protected] ~]# cat reflection.py
  8. #!/usr/bin/env python
  9. # _*_ coding:utf-8 _*_
  10. # 输入模块的名称
  11. mod_name = input("请输入模块名称>>>")
  12. # 输入函数or方法的名称
  13. func_name = input("请输入函数名称>>>")
  14. # 导入模块
  15. dd = __import__(mod_name)
  16. # 导入模块中的方法
  17. target_func = getattr(dd, func_name)
  18. # 查看target_func和dd.f1的内存地址
  19. print(id(target_func), id(dd.f1))
  20. # 执行target_func()函数
  21. result = target_func()
  22. # 输出结果
  23. print(result)
  24. [[email protected] ~]# python reflection.py
  25. # 输入模块名称commons
  26. 请输入模块名称>>>commons
  27. # 输入函数名称f1
  28. 请输入函数名称>>>f1
  29. # 返回内存地址
  30. 139844714989224 139844714989224
  31. # 执行的函数返回结果
  32. F1

反射相关的函数

getattr(object, name[, default])

根据字符串的形式去一个对象中寻找成员

  1. # 自定义模块的内容
  2. [[email protected] ~]# cat commons.py
  3. #!/usr/bin/env python
  4. Blog_Url = "https://yw666.blog.51cto.com"
  5. def f1():
  6.    return "F1"
  7. def f2():
  8.    return "F2"

  1. >>> import commons
  2. >>> getattr(commons, "f1")
  3. <function f1 at 0x7fbce5774598>
  4. >>> getattr(commons, "f1f1f1")
  5. Traceback (most recent call last):
  6.  File "<stdin>", line 1, in <module>
  7. AttributeError: module ‘commons‘ has no attribute ‘f1f1f1‘

执行获取到的函数

  1. >>> target_func = getattr(commons, "f1")
  2. >>> target_func
  3. <function f1 at 0x7fbce5774598>
  4. >>> target_func()
  5. ‘F1‘

通过设置默认值可以避免获取不到方法时报错

  1. # 设置一个默认值为None
  2. >>> target_func = getattr(commons, "f1f1f1", None)
  3. >>> target_func
  4. >>>

通过getattr获取模块中的全局变量

  1. >>> import commons
  2. >>> getattr(commons, "Blog_Url", None)
  3. ‘https://yw666.blog.51cto.com‘
  • setattr(object, name, value)

根据字符串的形式去一个对象中设置成员

设置全局变量

  1. # 获取commons内的Name变量
  2. >>> getattr(commons, "Name", None)
  3. # 在commons模块中设置一个全局变量Name,值为Ansheng
  4. >>> setattr(commons, "Name", "YangWen")
  5. # 获取commons内的Name变量
  6. >>> getattr(commons, "Name", None)
  7. ‘YangWen‘

getattr结合lambda表达式设置一个函数

  1. >>> setattr(commons, "as", lambda : print("as"))
  2. >>> getattr(commons, "as")
  3. <function <lambda> at 0x000001FD3E51FD90>
  4. >>> aa = getattr(commons, "as")
  5. >>> aa()
  6. as
  • delattr(object, name)

根据字符串的形式去一个对象中删除成员

  1. >>> getattr(commons, "Name")
  2. ‘Ansheng‘
  3. >>> delattr(commons, "Name")
  4. # 获取不到就报错
  5. >>> getattr(commons, "Name")
  6. Traceback (most recent call last):
  7.  File "<stdin>", line 1, in <module>
  8. AttributeError: module ‘commons‘ has no attribute ‘Name‘

hasattr(object, name)

根据字符串的形式去一个对象中判断成员是否存在

  1. # 如果不存在就返回False
  2. >>> hasattr(commons, "Name")
  3. False
  4. >>> setattr(commons, "Name", "YangWen")
  5. # 如果存在就返回True
  6. >>> hasattr(commons, "Name")
  7. True

(双下划线)import(双下划线)方式导入多层模块

  1. >>> m = __import__("lib.commons")    
  2. >>> m
  3. # 返回的路径是`lib`
  4. <module ‘lib‘ (namespace)>
  5. >>> m = __import__("lib.commons", fromlist=True)
  6. >>> m
  7. # 返回的路径是`lib.commons`
  8. <module ‘lib.commons‘ from ‘/root/lib/commons.py‘>

基于反射模拟Web框架路由系统

find_index.py文件内容

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. url = input("请输入url: ")
  4. target_module, target_func = url.split(‘/‘)
  5. m = __import__("lib." + target_module, fromlist=True)
  6. if hasattr(m, target_func):
  7.    target_func = getattr(m, target_func)
  8.    r = target_func()
  9.    print(r)
  10. else:
  11.    print("404")

目录结构及文件内容

  1. [[email protected] ~]# tree ./
  2. ./
  3. ├── find_index.py
  4. └── lib
  5.    ├── account.py
  6.    └── commons.py
  7. 1 directory, 3 files
  8. [[email protected] ~]# cat lib/commons.py
  9. #!/usr/bin/env python
  10. Blog_Url = "yw666.blog.51cto.com"
  11. def f1():
  12.    return "F1"
  13. def f2():
  14.    return "F2"
  15. [[email protected] ~]# cat lib/account.py
  16. #!/usr/bin/env python
  17. # _*_ coding:utf-8 _*_
  18. def login():
  19.    return "login"
  20. def logout():
  21.    return "logout"

执行

  1. [[email protected] ~]# python find_index.py
  2. 请输入url: account/login
  3. login
  4. [[email protected] ~]# python find_index.py
  5. 请输入url: account/logout
  6. logout
  7. [[email protected] ~]# python find_index.py
  8. 请输入url: commons/f1
  9. F1
  10. [[email protected] ~]# python find_index.py
  11. 请输入url: commons/f2
  12. F2
  13. [[email protected] ~]# python find_index.py
  14. 请输入url: commons/asdasd
  15. 404
时间: 2024-10-06 23:00:03

Python反射的相关文章

Python 反射机制详解

本文和大家分享的主要是python反射机制相关内容,一起来看看吧,希望对大家学习python有所帮助. 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述python的反射机制的使用场景和核心本质. 一.前言 1 def f1():2   print("f1是这个函数的名字!")3   4 s = "f1"

python 反射

1. 反射 实例:伪造web框架中的路由系统 利用反射导入模块 obj = __import__('commons') obj = __import__('lib.' + 'commons',fromlist = True) 导入模块不在当前目录下,需要设置fromlist参数为真, 才能拼接模块路径 利用反射操作对象成员(属性) 通过传入字符串,操作(检查/获取/删除/设置)对象成员(属性) hasattr(对象名,字符串),如果对象中存在名为字符串的属性(成员),返回True,否则返回Fal

python 反射(__import__、getattr)

#反射的作用在于模块导入,函数调用时简化代码 以URL为例: 假设URL的形式是A/B #!/usr/bin/env python# _*_ coding:utf-8 _*_# 常规'''from backend import login,logout,admindata = raw_input('请输入URL')if data == 'login/mylogin': login.mylogin()elif data == 'logout/mylogout': logout.mylogout()

python反射机制深入分析

对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述python的反射机制的使用场景和核心本质. 一.前言 def f1(): print("f1是这个函数的名字!") s = "f1" print("%s是个字符串" % s) 在上面的代码中,我们必须区分两个概念,f1和“f1".前者是函数f1的

python反射及内置函数方法

isinstance(obj,cls)检查是否是obj或cls类的对象 1 class Foo: 2 pass 3 obj=Foo() 4 print(isinstance(obj,Foo)) 5 运行结果是True检查sub类是否是super类的派生类 6 class Foo: 7 pass 8 class Bar(Foo): 9 pass 10 print(issubclass(Bar,Foo)) 11 运行结果是True 反射? 反射是指程序可以访问,检测和修改它本身状态或行为的一种能力(

Python反射、异常处理

反射 :字符串到对象属性的映射 hasattr(obj,string), 判断对象obj里面是否有叫string的字段或方法 getattr(obj,string) 获取obj对象里名叫string的字段或方法(如果重名先找字段) setattr(obj,y,v) 设置属性或者方法obj.y = v delattr(obj,y) 删除属性obj.y class Dog(object): def __init__(self,name): self.name = name def eat(self)

python 反射机制在实际的应用场景讲解

剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1" print("%s是个字符串" % s) 在上面的代码中,我们必须区分两个概念,f1和"f1".前者是函数f1的函数名,后者只是一个叫"f1"的字符串,两者是不同的事物.我们可以用f1()的方式调用函数f1,但我们不能用"f1&q

python反射机制实现

笔者之前看到很多撸java的同事.老是说着反射机制什么的,然后就想想我大Python肯定也有反射机制的实现方法,于是就写了下面的一段python实现的反射机制代码: comm模块代码 1 def jk(): 2 name = 'huangsonghui' 3 print(name) 4 return {1,2,3} main模块代码: import commdef run(): inp = input('enter:') if hasattr(comm,inp): d = getattr(com

Python ————反射机制

python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. # commons.py 文件 name = "nick" def f1(): return "This is f1." def f2(): return "This is f2." def nb(): return "This is ni