Python中的反射

简介: Python中的反射

反射

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

通过字符串操作类对象 或者 模块中的相关成员的操作

#hasattr() 检测对象/类是否有指定的成员

#getattr() 获取对象/类成员的值

#setattr() 设置对象/类成员的值

#delattr() 删除对象/类成员的值

attr是属性英文的前几个字母,属性指的是类中类变量、实例变量和方法。

但是要注意不能是私有的,如果你的变量是以“_”开头,那将无法获取。


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

一、 通过字符串反射类对象中的成员

class Father():
    pass

class Mother():
    pass
    
class Children(Father,Mother):
    eye = "蓝色的"
    weight = "1吨"
    
    def eat(self):
        print("小孩下生会喝奶")
    
    def drink(self):
        print("小孩下生喜欢喝勇闯天涯...")
        
    def __la(self):
        print("小孩自动啦,无法控制")
    
obj = Children()

(1)hasattr() 检测对象/类是否有指定的成员

#对象
res = hasattr(obj,"eye")
print(res)

#类
res = hasattr(Children,"eat123")
print(res)

hasattr()可以检测对象或类中是否包含某成员,第一个参数是类或者对象,第二个参数是 具体的成员。第二个参数以字符串方式写入

如果类或对象能调用该成员,返回真。不能调用返回假。从而判断是否有该成员

不能检测到类或对象的私有属性或方法

类中有私有成员方法

但却检测不到

(2)getattr() 获取对象/类成员的值

#对象

res = getattr(obj,"weight")
print(res)

#如果获取的值不存在,可以设置第三个参数,防止报错。第三个参数当成员不存在时返回该值,防止程序报错

如果不设置,就报错

res = getattr(obj,"weight123","抱歉这个值不存在")
print(res)

设置了,如果成员不存在,就返回设置的默认值

#类 反射方法

#通过类进行反射 (反射出来的是普通方法)

func = getattr(Children,"drink")
print(func)
func(1)

通过类反射出来的方法,如果该方法是绑定到对象方法,调用时要带参数,否则报错

#通过对象进行反射 (反射出来的是绑定方法) 调用时不用携带参数

func = getattr(obj,"drink")
print(func)
func()

打印方法,前面有bound method的是绑定方法

#综合案例

strvar = "eat11"
if hasattr(obj,strvar):
    func = getattr(obj,strvar)
    func()
else:
    print("抱歉,该成员不存在")


(3) setattr() 设置对象/类成员的值 setattr()方法里面三个参数。第一个参数是类或对象,第二个是成员方法或成员属性名,第三个是值

#对象

setattr(obj,"skin","黑人")
print(obj.skin)


#类

setattr(Children,"skin","土耳其人")
print(Children.skin)
print(obj.skin)

通过类反射设置的成员属性,对象能调用,但不是对象的成员。是类的成员

(4) delattr() 删除对象/类成员的值

# 对象
delattr(obj,"skin")
print(obj.skin)


# 类
delattr(Children,"skin")
print(Children.skin)

二、通过字符串反射模块中的成员

sys.modules 返回一个系统字典,字典的键是加载的所有模块
'__main__': <module '__main__' from '/mnt/hgfs/python32_gx/day25/2.py'>
字典中的__main__这个键对应的是该文件的模块对象;


def func1():
    print("我是func1方法")
def func2():
    print("我是func2方法")
def func3():
    print("我是func3方法")

import sys
print(sys.modules) # 系统字典
module = sys.modules["__main__"]
print(module)
res = getattr(module,"func1")
print(res)

sys.modules返回一个系统字典
__main__ 这个键的值 对应的就是当前文件的模块对象

可以通过getattr()方法获取当前模块中的成员方法或成员属性。并且可以调用

综合案例 : (通过字符串反射模块中的成员)

while True:
    strvar = input("请输入你想要使用的功能:")
    if hasattr(module,strvar):
        func = getattr(module,strvar)
        func()
    elif strvar.upper() == "Q":
        print("再见")
        break
    else:
        print("没有该成员~!")


相关文章
|
5月前
|
测试技术 API 数据库
Python反射机制在实际场景中的应用
Python 的反射机制是指在运行时动态地访问、检测和修改类和对象的属性和方法。:通过反射机制,可以动态加载和执行插件,无需在代码中硬编码每个插件的具体实现。这样可以实现插件化架构,使系统更加灵活和可扩展。:可以使用反射机制来读取和解析配置文件中的配置项,并动态地应用到程序中。这样可以实现灵活的配置管理,方便根据需要进行配置项的修改和扩展。:在自动化测试框架中,可以利用反射机制动态地加载和执行测试用例,从而实现自动化测试的灵活性和扩展性。
60 2
|
6月前
|
Python
python反射
python反射
|
4月前
|
程序员 开发者 Python
Python动态属性与反射机制方式
通过反射和动态属性,Python程序员获得了巨大的权能,能在运行时访问、修改或为对象新增属性和方法,显著提高编程的智能化和适应性。内置的反射机制可能使开发者跨越编写代码时的限制,通过名称访问对象的特性、方法以及其他成员,为创建一个具有高度配置性、扩展性强大的应用程序打下基础。此外,利用getattr和setattr函数来获取和设定对象的属性,或是利用hasattr确认其是否存在某属性,甚至可以通过名字来动态地执行对象的函数。 总之,反射和动态属性对于Python的程序开发而言是重要的工具,它们不仅提供了编写效率高且灵活的代码的能力,还为构建可高度定制和扩展的应用程序提供了可能。对于熟练掌握这些
|
5月前
|
安全 Python
深入浅出Python反射机制
1. 什么是反射 简单来说,反射就是程序在运行时能够"观察"自己,获取、检查和修改自身状态或行为的一种能力。听起来有点抽象?别急,我们慢慢道来。 在Python中,反射允许我们在代码运行时: • 查看对象有哪些属性和方法 • 获取属性的值 • 调用对象的方法 • 甚至动态地添加或修改属性和方法
|
5月前
|
Python
python反射 , 异常处理
python反射 , 异常处理
|
5月前
|
网络架构 Python
python的反射机制
python的反射机制
24 0
|
5月前
|
Python
Python反射和异常处理
Python反射和异常处理
|
6月前
|
Python
解释一下Python中的反射机制。
解释一下Python中的反射机制。
33 1
|
测试技术 Python
Python--getattr反射+selenium详解篇
Python--getattr反射+selenium详解篇
82 0