返回顶部
首页 > 资讯 > 后端开发 > Python >Python反射
  • 940
分享到

Python反射

反射Python 2023-01-31 05:01:15 940人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

反射的定义根据字符串的形式去某个对象中操作成员根据字符串的形式去一个对象中寻找成员根据字符串的形式去一个对象中设置成员根据字符串的形式去一个对象中删除成员根据字符串的形式去一个对象中判断成员是否存在初始反射通过字符串的形式,导入模块根据用户

反射的定义

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

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

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

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

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


初始反射

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

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

  1. # python使用的是3.5.1

  2. [root@root ~]# Python -V

  3. Python 3.5.1

  4. # commons.py为模块文件

  5. [root@root ~]# ls

  6. commons.py  reflection.py

  7. # commons.py文件内容

  8. [root@root ~]# cat commons.py

  9. #!/usr/bin/env python

  10. # 定义了连个函数,f1和f2

  11. def f1():

  12.    return "F1"

  13. def f2():

  14.    return "F2"

  15. [root@root ~]# 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. [root@ansheng ~]# python reflection.py

  30. # 输入模块名称

  31. 请输入模块名称>>> commons

  32. # 返回输入的内容及数据类型

  33. commons <class 'str'>

  34. # 执行F1函数

  35. F1

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

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

  1. [root@root ~]# cat commons.py

  2. #!/usr/bin/env python

  3. def f1():

  4.    return "F1"

  5. def f2():

  6.    return "F2"

  7. [root@root ~]# 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. [root@root ~]# python reflection.py

  25. # 输入模块名称commons

  26. 请输入模块名称>>>commons

  27. # 输入函数名称f1

  28. 请输入函数名称>>>f1

  29. # 返回内存地址

  30. 139844714989224 139844714989224

  31. # 执行的函数返回结果

  32. F1

反射相关的函数

getattr(object, name[, default])

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

  1. # 自定义模块的内容

  2. [root@root ~]# 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. [root@ansheng ~]# tree ./

  2. ./

  3. ├── find_index.py

  4. └── lib

  5.    ├── account.py

  6.    └── commons.py

  7. 1 directory, 3 files

  8. [root@root ~]# 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. [root@root ~]# 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. [root@root ~]# python find_index.py

  2. 请输入url: account/login

  3. login

  4. [root@root ~]# python find_index.py

  5. 请输入url: account/logout

  6. logout

  7. [root@root ~]# python find_index.py

  8. 请输入url: commons/f1

  9. F1

  10. [root@root ~]# python find_index.py

  11. 请输入url: commons/f2

  12. F2

  13. [root@root ~]# python find_index.py

  14. 请输入url: commons/asdasd

  15. 404


--结束END--

本文标题: Python反射

本文链接: https://lsjlt.com/news/188104.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 反射
    1.反射 主要是用到了4个函数(  用的最多的就是getattr()和 hasattr()  ): getattr()   从xxx对象中获取到xxx属性值 hasattr()  判断xxx对象中是否有xxx属性值delattr()   ...
    99+
    2023-01-30
    反射 python
  • Python-----反射
    class Person(object): """定义一个人类""" def __init__(self, name): self.name = name def eat(self, food): ...
    99+
    2023-01-31
    反射 Python
  • Python反射
    反射的定义根据字符串的形式去某个对象中操作成员根据字符串的形式去一个对象中寻找成员根据字符串的形式去一个对象中设置成员根据字符串的形式去一个对象中删除成员根据字符串的形式去一个对象中判断成员是否存在初始反射通过字符串的形式,导入模块根据用户...
    99+
    2023-01-31
    反射 Python
  • Python 反射-isinstance
    用到的 isinstance(对象,类)  -------------------  判断一个对象是否是一个类的实例 issubclass(子类,父类)  ----------------  判断一个类是否是一个类的子类 hasattr(...
    99+
    2023-01-30
    反射 Python isinstance
  • python之反射
    1. isinstance, type, issubclass的区别 class Animal: def eat(self): print("刚睡醒吃点儿东西") class Cat(Animal): ...
    99+
    2023-01-30
    反射 python
  • Python基础:反射
    反射就是根据提供的字符串,匹配对象(类、模块等)里面的方法。达到动态调用的目的。主要有四个成员。getattr、hasattr、setattr、delattr  获取成员、检查成员、设置成员、删除成员语法:getattr(对象,字符串)se...
    99+
    2023-01-31
    反射 基础 Python
  • Python功能之反射
    有如下文件:index.py#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'ryan' """ import home print 'oldboy....' url=ra...
    99+
    2023-01-31
    反射 功能 Python
  • python学习之反射
    python学习反射实例1脚本内容如下:#coding: utf8class myClass(object):    def fax(self):        print 'faxing....'    def copy(self):  ...
    99+
    2023-01-31
    反射 python
  • 【javaSE】 反射与反射的使用
    文章目录 🌲反射的定义🎍反射的用途🌴反射基本信息🍀反射相关的类🚩Class类(反射机制的起源 )🎈...
    99+
    2023-09-16
    开发语言 java 反射
  • Unity3d 射线反射
    As any person that has already used Unity’s Ray class knows, there’s no support for reflection, which could be useful fo...
    99+
    2023-01-31
    射线 反射 Unity3d
  • python学习 day018打卡 反射
    本节主要内容: 1.isinstance,type,issubclass 2.区分函数和方法 3.反射(重点)   一.isinstance,type,issubclass issubclass():判断xxx类是否是yyy类型的子类 ...
    99+
    2023-01-30
    反射 python
  • python记录_day18 反射 判断
    一、三个内置函数 1、issubclass(a, b)  判断a类是否是b类的子类 1 class Foo: 2 pass 3 4 class Zi(Foo): 5 pass 6 7 class S...
    99+
    2023-01-30
    反射 python
  • python面向对象(反射)(四)
    1. isinstance, type, issubclass     isinstance: 判断你给对象是否是xx类型的. (向上判断     type: 返回xxx对象的数据类型     issubclass: 判断xxx类是...
    99+
    2023-01-30
    反射 面向对象 python
  • python面向对象之反射
    一、静态方法(staticmethod)和类方法(classmethod)类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性)静态方法:让类里的方法直接被类调用,就像正常调用函数一样类方法和静态方...
    99+
    2023-01-31
    反射 面向对象 python
  • PHP 反射
    阅读目录 参考文档Laravel 通过类的反射, 对类的私有属性赋值TestController 类TwoTestController 类预览 PHP中的反射理解PHP反射API均以 Re...
    99+
    2023-09-02
    php 开发语言 前端
  • Python27 反射
    反射:通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法 1.getattr: 2.hasattr:判断一个对象里是否有对应(相同名称)字符串的方法 3.setattr 4.delattr class Dog(object)...
    99+
    2023-01-31
    反射
  • Python_反射
    一.反射定义放射是指程序可以访问。检测和修改它本身状态或行为的一种能力(自省)。二.四个自省的函数Python中提供了以下四种自省的函数,使用于类和对象。1.hasattr函数--用于判断obj中有没有name字符串对应的方法或属性,若有返...
    99+
    2023-01-31
    反射
  • AS3反射
    反射这玩意,在一些游戏的框架中的确有其优势,但是注意反射或多或少会影响性能的.在资源的获取上就 使用了反射 , 得到SWF中的美术的资源 如:public static function getClazz(className : Strin...
    99+
    2023-01-31
    反射
  • Python反射机制实例讲解
    目录1. 反射的四个函数2. 类的反射操作3. 当前模块的反射操作4. 其他模块反射操作5. 反射应用场景之一6. 反射应用场景之二7. 总结通常,我们操作对象的属性或者方法时,是通...
    99+
    2024-04-02
  • python反射的作用是什么
    Python反射是指在运行时获取、检查和修改对象的属性和方法,而不需要明确知道这些属性和方法的名称。它的主要作用是增强程序的灵活性和...
    99+
    2023-09-26
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作