Python反射

深入浅出Python反射机制 简单来说,反射就是程序在运行时能够"观察"自己,获取、检查和修改自身状态或行为的一种能力。听起来有点抽象?别急,我们慢慢道来。在Python中,反射允许我们在代码运行查看对象有哪些属性和方法获取属性的值调用对象的方法甚至动态地添加或修改属性和方法这就好比你有了透视眼,可以看穿对象的"内心世界",还能随心所欲地改变它们。酷不酷?那为什么反射在Python中如此重要呢?Python是一门动态语言,反射机制让它的动态特性发挥到极致。你可以根据不同情况动态地操作对象,这在写出通用性强的代码时特别有用。 阅读详情

Python反射

反射是什么

在计算机学中,反射式编程(英语:reflective programming)或反射(英语:reflection),是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。(摘自维基百科)

反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动。(来源:Python面试笔试300题 https://zhuanlan.zhihu.com/p/40724658)

反射的 Python 用法

用反射,可以在编译时不确定目标对象的属性、方法、类型等,而是在程序运行时才对目标对象进行增删改查。类比物理中的反射,由于视线遮挡,我们通过湖面的反射观察天空飞过的鸟。
在这里插入图片描述
在这里插入图片描述

【查】判断对象所属的类

远处飞来的到底是一只什么鸟?麻雀?大雁?
原来都不是,远处飞来的是一个飞机模型。
在这里插入图片描述

type 和 isinstance
# -*- coding: utf-8 -*-

class Bird:
    pass

bird = Bird()

print(type(bird) == Bird)
# True

print(isinstance(bird, Bird))
# True

globals 和 locals

globals() 函数会以字典类型返回当前位置的全部全局变量。
locals() 函数会以字典类型返回当前位置的全部局部变量。

print(globals())
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x011EAF40>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Test/main.py', '__cached__': None, 'Bird': <class '__main__.Bird'>, 'bird': <__main__.Bird object at 0x0121E5E0>}

print(locals())
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x011EAF40>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Test/main.py', '__cached__': None, 'Bird': <class '__main__.Bird'>, 'bird': <__main__.Bird object at 0x0121E5E0>}

hasattr 和 getattr

hasattr() 函数用于判断对象是否包含对应的属性。
getattr() 函数用于返回一个对象属性值。

print(hasattr(bird, "__class__"))
# True

print(getattr(bird, "__class__"))
# <class '__main__.Bird'>
inspect

是用来获取对象的信息,对象包括模块(往往是一个py文件)、类、方法、函数、报错追踪、帧对象和代码对象。(来源:Python库介绍(一)——inspect https://zhuanlan.zhihu.com/p/290018252)

import inspect

print(inspect.getmembers(bird))
# [('__class__', <class '__main__.Bird'>), ('__delattr__', <method-wrapper '__delattr__' of Bird object at 0x00F5E5E0>), ('__dict__', {}), ('__dir__', <built-in method __dir__ of Bird object at 0x00F5E5E0>), ('__doc__', None), ('__eq__', <method-wrapper '__eq__' of Bird object at 0x00F5E5E0>), ('__format__', <built-in method __format__ of Bird object at 0x00F5E5E0>), ('__ge__', <method-wrapper '__ge__' of Bird object at 0x00F5E5E0>), ('__getattribute__', <method-wrapper '__getattribute__' of Bird object at 0x00F5E5E0>), ('__gt__', <method-wrapper '__gt__' of Bird object at 0x00F5E5E0>), ('__hash__', <method-wrapper '__hash__' of Bird object at 0x00F5E5E0>), ('__init__', <method-wrapper '__init__' of Bird object at 0x00F5E5E0>), ('__init_subclass__', <built-in method __init_subclass__ of type object at 0x01B8A3D8>), ('__le__', <method-wrapper '__le__' of Bird object at 0x00F5E5E0>), ('__lt__', <method-wrapper '__lt__' of Bird object at 0x00F5E5E0>), ('__module__', '__main__'), ('__ne__', <method-wrapper '__ne__' of Bird object at 0x00F5E5E0>), ('__new__', <built-in method __new__ of type object at 0x5E187B78>), ('__reduce__', <built-in method __reduce__ of Bird object at 0x00F5E5E0>), ('__reduce_ex__', <built-in method __reduce_ex__ of Bird object at 0x00F5E5E0>), ('__repr__', <method-wrapper '__repr__' of Bird object at 0x00F5E5E0>), ('__setattr__', <method-wrapper '__setattr__' of Bird object at 0x00F5E5E0>), ('__sizeof__', <built-in method __sizeof__ of Bird object at 0x00F5E5E0>), ('__str__', <method-wrapper '__str__' of Bird object at 0x00F5E5E0>), ('__subclasshook__', <built-in method __subclasshook__ of type object at 0x01B8A3D8>), ('__weakref__', None)]

其他

还有很多魔术方法像 __ dir __ 、__getattribute__ ,执行函数 eval、exec 。

【删】删除对象的属性

这里和物理的反射就有区别了,我们并不能通过湖面的倒影对实际的飞机模型产生影响。所以物理反射其实与内省或自省更相似。

要注意术语“反射”和“内省”(type introspection)的关系。内省(或称“自省”)机制仅指程序在运行时对自身信息(称为元数据)的检测;反射机制不仅包括要能在运行时对程序自身信息进行检测,还要求程序能进一步根据这些信息改变程序状态或结构。(摘自维基百科)

delattr 函数用于删除属性。
del 也能用来删除属性。

bird.age = 5

print(hasattr(bird, "age"))
# True

delattr(bird, "age")
print(hasattr(bird, "age"))
# False


bird.fly = 1   
print(bird.fly)
# 1

del bird.fly
print(hasattr(bird, "fly"))
# False

【改】修改对象的属性

刚好手里有一个控制飞机模型的万能遥控器,不管来的是什么飞机,我们直接调转它的方向。
在这里插入图片描述

setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的。

print(hasattr(bird, "direction"))
# False

setattr(bird, "direction", "left")
print(bird.direction)
# left

【增】动态加载模块

假如没有万能遥控器,为每种飞机带一个遥控器,只有几个时没有问题,当超过一定数量时就无法实现了。
在这里插入图片描述

不使用反射,为每种飞机单独写同样的代码,虽然重复,但是也能实现需要的功能。所以反射更适用于编写较抽象、通用的框架。

python动态加载模块的方法(别人写的很详细就不再单独列举了):

  1. importlib.import_module
  2. types.ModuleType
  3. stevedore使用setuptools的entry points来定义并加载插件

相关文章:
python 动态导入模块,实现模块热更新 https://blog.youkuaiyun.com/weixin_40647516/article/details/126537108

Python插件之stevedore
https://blog.youkuaiyun.com/weixin_43700106/article/details/107150715

Python语言 的反射(Reflection) 反射是编程语言的一种重要特性,它允许程序在运行时检查和操作对象的属性和方法。在Python中,反射使得开发者能够动态地访问对象的内部状态和能力,从而增强了代码的灵活性和可扩展性。本文将深入探讨Python中的反射机制,涵盖其基本概念、实现方法以及常见应用场景。 阅读详情

相关推荐

python基础:反射(详解)

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

金鞍少年的博客 1824

【测试开发】python系列教程:python反射

在java中大家都知道,java的反射的机制,其实在python中也是有反射机制的,我们看下如何 来用?

m0_75277660的博客 4065

使用 Python 模拟光的折射,反射,和全反射

使用 Python 模拟光的折射,反射,和全反射

不迁怒,不贰过。小知识,大智慧。 1990

Python的反射(Reflection)

这包括获取对象的类、方法、属性等信息,以及动态地调用对象的方法和修改对象的属性等。3. `getattr()` 函数:可以用来获取一个对象的方法或属性。1. `type()` 和 ` isinstance()` 函数:可以用来获取对象的类型或一个对象是否是某个类的实例。4. `setattr()` 函数:可以用来动态地给一个对象设置属性。2. `dir()` 函数:可以用来获取一个对象的所有属性和方法。6. `delattr()` 函数:可以用来删除一个对象的属性。4. 类和对象的动态创建和修改。

iamnotacoder的博客 1205

一文了解Python反射机制(很详细)

反射(Reflection)是计算机科学中的一个重要概念,指的是在程序运行时动态地访问、检查和修改其状态或行为的能力。在Python等动态语言中,反射允许程序在运行时操作对象的属性、方法和类信息,而无需在编译时确定这些操作。

旦莫的博客 7143

modbus-esp8266库深度解析:工业级Modbus协议栈实现

Modbus是一种广泛应用于工业自动化领域的通用串行通信协议,其核心在于标准化的功能码、寄存器模型与帧结构设计。基于RTU、ASCII和TCP三种传输变体,Modbus协议通过主从架构实现设备间可靠数据交互,具备低开销、高兼容性与强实时性等技术价值。在边缘计算与工业物联网场景中,它被广泛用于PLC通信、传感器数据采集、HMI集成及远程固件升级(FOTA)等关键任务。针对ESP8266/ESP32等Wi-Fi微控制器平台,modbus-esp8266库提供了完整协议栈支持,涵盖多实例并发、回调驱动架构、零拷贝

weixin_42315569的博客 351

Python中反射

反射 运行时,区别于翻译时,指的是程序被加载到内存中执行的时候。 反射,reflection,指的是运行时获取类型定义信息。 一个对象能够在运行时,像照镜子一样,反射出其类型信息。简单说,在Python中,能够通过一个对象,找出其type、class、attribute或method的能力,称为反射或自省。 具有反射能力的函数有type(),isinstance(),callable().dir(...

都枯槐的博客 1万+

数字IC时序约束实战:深入解析clock_uncertainty的设置策略与后端影响

本文深入探讨数字IC设计中clock_uncertainty的设置策略及其对后端实现的影响。通过分析时钟不确定度的组成(包括clock_skew、clock_jitter和margin),并结合实际项目经验,详细介绍了在不同设计阶段(综合、布局布线、签核)的动态调整方法。文章还提供了工程化处理参数来源、跨时钟域特殊处理以及优化时序收敛的实用技巧,帮助工程师提升数字IC设计的可靠性和性能。

weixin_29284657的博客 229

python反射详解

一、什么是反射 反射就是通过字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动 可使用反射的地方: 1、反射类中的变量 : 静态属性,类方法,静态方法 2、反射对象中的变量、对象属性、普通方法 3、 反射模块中的变量 4、反射本文件中的变量 getattr(核心) 判断类、对象或者模块中是否有相应的属性或方法。用法:getattr(obj,str,default=None) 判断obj中是否有str属性,有就返回,没有时有传入第三参数就返回第三参数,没有就报错。 cl

python学习者的博客 8939

Pulpino SoC中挂载AXI从机接口的自定义IP说明

AXI 从机接口挂载 Pulpino SoC 调试Pulpino SoC中挂载AXI从机接口的自定义IP说明PULPion SoC介绍自定义AXI IP挂载IP挂载框图代码修改脚本修改自定义AXI IP调试C语言编写软件调试硬件调试 Pulpino SoC中挂载AXI从机接口的自定义IP说明 本篇文章主要从工程的角度描述了如何将具有AXI从机接口的自定义IP挂载到Pulpino SoC上,其中不涉及到SoC中的任何原理知识。 PULPion SoC介绍 PULPion SoC整体架构如下图所示, PULPi

小陈的芯片学习之路 2211

EEGLAB数据预处理基本流程GUI实操指南

按钮,会出现如上图所示的长条形对话框,方框里面是所有电极的名称,这时将需要的剔除的电极选择上,如上图,我选择了 VEOG这个电极(该电极表示是垂直眼电),然后点“OK”,在弹出的对话框中自行确定是否需要修改命名。坏导是指在数据采集时,由于各种原因(如,电极本身问题或阻抗不好等)导致数据记录有问题,但是在后期又特别想要该通道的数据,那么就可以利用插值的方法进行——利用该导联周边的几个电极点的均值作为该导的数据。上图的图是通过IClabel的工具箱进行自动判断的,可以帮助自动识别出哪些是Eye的成分。

fdgdf5535的博客 6397

Python之反射

反射 描述 反射就是指在程序运行时,动态的去确定对象的类型,并且可以通过字符串的的形式去调用对应的属性,方法,导入模块,是一种基于字符串的事件驱动 举一个例子: class Student: def __init__(self): self.name = 'mhy' self.price = '5000' obj1 = Student() content ...

qq_36850246的博客 263

PCL 贪婪投影三角剖分算法【2025最新版】

本博客在学习PCL中的贪婪投影三角算法的基础上,实现了使用彩色点云重建彩色模型的应用案例。博客长期更新,最近一次更新时间为:2025年7月6日。

点云侠的博客 37万+

python反射实例化_python反射

定义:通过字符串的形式去操作对象(类,实例对象,模块中的对象)中的成员(增删改查)叫反射。一、类实例对象classFoo:tests='test'def__init__(self,name,age):self.name=nameself.age=agedefshow(self):return"%s-%s"%(self.name,self.age)obj=Foo("sa...

weixin_33302195的博客 382

华为OD机试真题 新系统 【社交网络相同爱好好友查询】

华为od机试真题 新系统【社交网络相同爱好好友查询】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试真题【社交网络相同爱好好友查询】多语言题解实现。

qq_45776114的博客 1338

2026软考中级-软件设计师笔记(送最新视频教程)

核心口诀:运控存输输(运算器、控制器、存储器、输入、输出)例题(2019年上半年):核心公式:数字签名流程:数字证书作用:死锁4个必要条件:死锁判断公式:处理策略:程序设计语言的四大核心成分:顺序表操作(时间复杂度):链表操作(时间复杂度):核心思想:频率高的字符用短编码,频率低的用长编码 → 最小化总编码长度构造步骤(贪心算法):前提:有序表(升序/降序) 步骤:时间复杂度:O(log₂n) 例:查找中核心思想:用哈希函数将关键字映射到存储位置 哈希冲突:不同关键字映射到同一位置 → 用链地址法或开放定址

36万+

python反射

1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。 2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射) 四个可...

今晚打老虎的博客 374

自然语言处理6 -- 情感分析

1 概述 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。 情感分析可以采用基于情感词典的传统方法,也可以采用基于深度学习的方法,下面详细讲解 ...

谢杨易的博客 5万+

Python : 反射

  Java是一门面向对象的语言。 每一个Class,可以有instance,可以有Class对象。Instance的作用是调用方法、获取属性的,而Class对象则是获取类有哪些属性、方法的。Class对象与instance结合,也可以完成对instance方法的调用等。Java中的绝大部分框架,都离不开发射。那么在Python中,是否也有类似机制呢? 1、根据instance获...

146

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Python之反射浅谈

日期:2020年3月19日 作者:Commas 注释:学习就是为了忘记 如果您想了解更多有关Python的知识,那么请点《我的Python浅谈系列目录》 文章目录一、反射是什么?二、反射的四大工具三、反射的实例解说 一、反射是什么? 反射是一个非常重要的概念,它是一种字符串与对象的映射关系,利用字符串去操作对象,可以对操作的对象进行成员的查找、获取、添加以及删除。通俗地说,反射是一种基于字...

Commas的博客 757

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

python 反射_python中的反射

什么是反射?1、有时我们要访问某个变量或是方法时并不知道到底有没有这个变量或方法,所以就要做些判断。判断是否存在字符串对应的变量及方法。2、我们知道访问变量时是不能加引号的,否则会被当成字符串处理。如果要通过字符串找到对应的变量,那该怎么办呢 反射就是用于解决上面两个问题而产生的,所谓反射,按我的理解就是反过来告诉我字符串是什么,是变量or方法python的反射,它的核心本质其实就是利用字符...

weixin_39775872的博客 282

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Python的反射机制

Python反射机制的基本原理和应用

qq_52758588的博客 2093

Python小姿势 - 如何在Python中实现反射?

《100天精通Python》专栏,最详细的Python入门到精通教程;理论篇基础知识讲解构建体系框架、实践篇Python黑科技学以致用。https://blog.youkuaiyun.com/weixin_39032019/category_12263598.html

独木不成林,单弦不成音。 2844

python 反射

一 什么是反射 指程序可以访问、检测和修改它本身状态或行为的一种能力 二 python 中的反射 python 中一切皆对象,只要是对象都可以反射,python 实现反射是通过字符串的形式操作对象的属性。 三 python反射的关键函数 hasattr:返回对象是否具有给定名称的属性 getattr:获取对象指定名称的属性 setattr:给指定对象的指定属性设置为值 delattr:从指定对象中删除指定属性 class A: n = 1 def __init__(self, nam

刹那间的回眸 1418

python等语言的反射

语言类型系统反射风格/感觉关键 API/函数Go静态明确、独立、偏底层,区分 Type 和 ValueJava静态强大、框架核心、面向对象Python动态无缝集成、语言核心、日常使用JavaScript动态无处不在,非常灵活typeof, obj['prop'], Reflect 对象C#静态非常强大,与 Java 类似Ruby动态极致的元编程,一切皆可动态修改C++静态原生不支持,仅有基础 RTTItypeid, dynamic_cast (需依赖库)

u011091936的博客 1137
上一篇: wxPython和pycairo练习记录11
下一篇: 事件与信号
SmileBasic
博客等级 码龄5年 347粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值