首页 > 编程语言 >Python反射机制

Python反射机制

时间:2023-03-14 21:58:09浏览次数:37  
标签:反射 bar name Python object getattr print 机制 属性

Python反射机制

1.Python反射机制

反射使得程序具有在运行时动态修改自己的结构和行为的能力,比如导入模块,调用函数等等,这些都是python的反射机制,是一种编程方法,设计模式的提现。

python的四个重要 内置函数: getattr、hasattr、delattr和setattr较为全面的实现了基于字符串的反射机制。他们都是对内存内的模块进行操作,并不会对源文件进行修改

内置函数:

  • getattr(object,name[,default]) 通过name返回object的属性值,当属性不存在,将使用default 返回,如果没有default,则抛出AttributeError,name必须是字符串
  • setattr(object,name,value) object的属性,则覆盖,不存在则新增
  • hasaattr(object,name) 判断对象是否有这个名字的属性,name必须为字符串

2.getattr() 函数用于返回一个对象属性值

getattr(object, name[, default])

参数:

-object 对象

-name -字符串,对象属性

-default - 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError

class A(object):
    bar = 1

    def my_function(name):
        print('hello :', name)

a = A()
# 属性部分
print(getattr(A, 'bar'))  # 1  反射有 
print(getattr(A, 'bar0', 500))  # 没有bar0 变量名 返回 默认值结果
print(getattr(A, 'bar0'))  # 不设置默认值  触发AttributeError
# 函数部分
print(getattr(A,'my_function')('my_function'))
 #  hello : my_function
 #  None

这就是python的反射,它的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的时间驱动

3.hasattr 检查对象是否有某个属性

如果指定的对象拥有指定的属性,则 hasattr() 函数将返回True,否则返回False。

print(hasattr(A,'bar'))  			  # True
print(hasattr(A,'bar1')) 		       # False
print(hasattr(A,'my_function'))         # True

4. serattr() 函数指定对象的指定属性的值

setattr(object, attribute, value)

参数信息:

  • object 必须。 对象
  • attribute 必需。您希望设置的属性的名称。
  • value 必须。 需要。您要赋予指定属性的值
# 给对象 A 设置一个新的 age 属性
setattr(A,'age',40)
print(getattr(A,'age'))		# 40

# 修改对象 A 的 bar属性值
setattr(A,'bar',50)
print(getattr(A,'bar'))   # 50

5. delattr() 函数将从指定对象中删除指定属性

delattr(object, attribute)

参数信息:

  • object 必须。 对象
  • attribute 必须。 您希望删除属性的名称。
# 删除已有的属性值
print("删除之前", getattr(A, 'bar'))  # 1 
delattr(A,'bar')   
print("删除之后", getattr(A,'bar'))   
# AttributeError: type object 'A' has no attribute 'bar'

通过__import__函数,我们实现了基于字符串的动态的模块导入。

最关键的是obj = __import__(modules)这一行,它让程序去导入了modules这个变量保存的字符串同名的模块,并将它赋值给obj变量。

obj = __import__(路径 + modules, fromlist=True) # 注意fromlist参数

本文的核心主题是如何利用字符串驱动不同的事件,比如导入模块、调用函数等等,这些都是python的反射机制,是一种编程方法、设计模式的体现,凝聚了高内聚、松耦合的编程思想,不能简单的用执行字符串来代替。

标签:反射,bar,name,Python,object,getattr,print,机制,属性
From: https://www.cnblogs.com/wei0919/p/17216543.html

相关文章

  • Python递归画树 - 画蕨类植物 - 画窗格 - 搭建分形平台
    @目录画树画蕨类植物画窗格分形平台画树importnumpyasnpimportcv2importmathdefdraw_tree(img,origin,length,angle,scale,left_angle,left_scale,ri......
  • 实验1 Python
    1.1print('hey,u')x,y,z=1,2,3print(x,y,z)print('x=%d,y=%d,z=%d'%(x,y,z))print('x={},y={},z={}.format(x,y,z)')print(f'x={x},y={y},z={z}')print(x)print(y......
  • opencv-python笔记(1)
    openCV笔记图像灰度图像​ 0代表纯黑色,255代表白色(类似亮度)通道拆分通过索引拆分:importcv2lena=cv2.imread("lenacolor.png")cv2.imshow("lena1",lena)b=lena[:......
  • Python+ESP32 收录集
    目录Python+ESP32收录集Python+ESP32收录集Python+ESP32快速上手(持续更新中)wifi蓝牙智能控制单片机手把手教你学ESP32--基于MicroPython......
  • HJ走方格的方案数_动态规划 python
      1importsys2m,n=list(map(int,sys.stdin.readline().strip().split()))3#记录横向小格边为1,竖向为-1。n=1*n,m=-1*m4#记录从出发点到每个节点的走法,取......
  • 实验1 Python开发环境使用和编程初体验
    实验一task1-1.python实验源码1#print输出的几种用法23#用法1:用于输出单个字符串或单个变量4print('hey,u')56#用法2:用于输出多个数据项,用逗号分隔......
  • 实验1 Python开发环境使用和编程初体验
    实验任务1#task1_1:print输出的几种用法实验内容#用法1:输出单个字符串或者变量print("hey,u")#用法2:用于输出多个数......
  • 实验1Python初体验
    实验任务1task1_1.py实验源码print('hey,u')print('hey','u')x,y,z=1,2,3print(x,y,z)print('x=%d,y=%d,z=%d'%(x,y,z))print('x={},y={},z={}'.form......
  • 实验1 python开发环境使用和编程初体验
    实验任务1: task1_1.py print('hey,u')print('hey','u')x,y,z=1,2,3print(x,y,z)print('x=%d,y=%d,z=%d'%(x,y,z))print('x={},y={},z={}......
  • 反射和注解及二者综合案例
    一、反射1、反射概述在java.lang.reflect包是这么描述的:提供类和接口,以获得关于类和对象的反射信息。在安全限制内,反射允许编程访问关于加载类的字段、方法和构造方法......