程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

python反射机制学习总结

hfteth 2025-02-28 15:55:12 技术文章 16 ℃

一、反射概念理解

因为python是动态语言,只要是动态语言就一定会有反射机制。

反射机制含义:在程序运行过程中,动态获取对象的信息,以及动态调用对象方法的功能。

所以我们需要在程序运行过程中,让程序自己能动态获取到对象的属性和方法,而这种动态获取对象属性,以及动态调用对象方法的功能,就是反射机制。

查看对象有哪些属性的方法 obj.(__dict__)

obj.dir("属性") 这个方法可以查看到一个对象下面,可以点出来哪些属性

二、python如何实现反射机制

python提供四个内置函数:

obj.hasattr() 判断obj对象是否有某一个属性

obj.getattr() 获取obj对象的某一个属性

obj.setattr() 给obj对象某一个属性赋值

obj.delattr() 删除obj对象某一个属性

这四个函数就是通过字符串的形式,来操作对象的属性的

class Human():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print('name:', self.name, 'age:', self.age)

obj = Human('蓝猫', 18)

print(hasattr(obj, 'name'))  # 输出结果:True
print(getattr(obj, 'name'))  # 输出结果:蓝猫。str类型   相当于obj.name,以字符串形式访问属性  print(obj.name)
setattr(obj, 'name', '小黄鸭')  # 没有返回值,输出是None
print(getattr(obj, 'name'))  # 输出结果:小黄鸭
delattr(obj, 'name')  # 没有返回值,输出是None
print(obj.__dict__)  # 输出结果:{'age': 18}

# getattr() 还可以传第三个参数
print(getattr(obj,'x',None))   #obj 对象没有 x 属性,就返回None,程序不会报错,有属性就取对应属性值

python反射机制:反射就是我们在不知道对象具体是什么的情况下,让我们的程序能够动态分析出来对象里面有什么,能够get出来什么属性。反过来说我们不知道使用者调用对象的什么方法,有可能使用者想调用的方法对象里面有,也有可能没有。所以我们需要让程序自动分析出来到底有没有,有就调用,没有就跳过

所以python反射机制是一种程序动态分析的能力

快捷键去掉黄色波浪线方法: Ctrl + Alt + L,达到美化python代码的效果

三、python反射机制应用场景

可以动态监测用户行为完成响应接口的调用

class Ftp:
    def put(self):
        print("正在上传数据------")
    def get(self):
        print('正在下载数据------')
    def interact(self):
        opt = input("请输入你要操作的项目").strip()
        print(dir(self)) # 获取该对象下所有的属性
        if hasattr(self,opt):# 判断该属性下是否有用户输入的属性
            getattr(self,opt)() # 如果用户刚好输入的是函数名加上括号就执行了该函数
        else:
            print("程序错误,功能不存在")

obj = Ftp()
obj.interact()
class Ftp:
    def put(self):
        print("正在上传数据")
    def get(self):
        print("正在下载数据")
    def interact(self):
        opt = input('请输入功能选项:').strip()
        getattr(self,opt,self.warnning)()   # 使用getattr() 第三个参数传值进去

    def warnning(self):
        print("功能错误")
obj = Ftp()
obj.interact()

这个例子说明,python反射和函数字典很像,定义一堆函数,把这些函数名都整理到了一个字典里面,接着让用户选择功能编号,用户选择不同的编号,我们就执行不同的函数。也可以算是一种反射的应用,比我们这个要麻烦一点。

这是我看了小飞哥视频的总结,若有补充或错去,欢迎各位大佬指出。

Tags:

最近发表
标签列表