• Python笔记_第四篇_高阶编程_反射_(getattr,setattr,deattr,hasattr)


    1. 元数据和反射概念

      有关程序及其类型的数据成为元数据(metadata),他保存在程序的程序集中。

      反射这个词儿听起来比较陌生。程序在运行时,可以查看其它程序集或其本身的元数据。一个运行的程序查看本身的元数据的行为成为反射(reflection)

      对象浏览器是显示元数据的程序的的一个示例。他可以读取程序集,然后显示所包含的类型及类型的所有特性和成员。

    2.举例说明

      比如:我们现在有这样一个需求,已有三个函数fun1,fun2,fun3这三个函数,我们都找到如果我们想调用其中某个函数的时候,我们只有在代码中写好,

      s.py

    def fun2():
        return "fun2"
    
    
    def fun1():
        return 'fun1'
    
    
    def fun3():
        return 'fun3'

      test.py

    import s  #导入s.py文件。
    
    call_str = input("input which function you want to call :")
    
    if call_str == 'fun1':
        print(s.fun1())
    elif call_str == 'fun2':
        print(s.fun2())
    elif call_str == 'fun3':
        print(s.fun3())
    else:
        print("404 not Found")

      运行文件test.py后输入对应的函数名就可以调用响应的函数了。如果在s.py文件中,有成千个函数!岂不是我们想象以上方式调用的时候写上n个判断语句,这样是不是太麻了。

      所有Pyt给我们提供了强大的反射机制,这个反射机制是通过“字符串返回映射到代码中的一种机制”。

      这边是反射的意思了。

    3.Py中怎么使用反射

      其中Py中提供了四个反射函数

      3.1 getattr函数:获取对象的方法或变量的内存地址

    import s
    
    call_str = input("input which function you want to call :")
    
    # if call_str == 'fun1':
    #     print(s.fun1())
    # elif call_str == 'fun2':
    #     print(s.fun2())
    # elif call_str == 'fun3':
    #     print(s.fun3())
    # else:
    #     print("404 not Found")
    
    obj = getattr(s, call_str) # 其中的s是值的带入的s文件,s也可以换为其他的你想倒入的模块等
    print(obj())
    
    input which function you want to call :fun1
    fun1

      运行后我们输入:fun1,fun2,fun3都没有问题,但是当我们乱输入一个字符串的时候getattr内置函数就报错了。当然,我们可以通过try...except语句进行判断这个问题。但是我们还可以使用hasattr这个内置函数。

      3.2 hasatter函数:返回True or False

    import s
    
    call_str = input("input which function you want to call :")
    
    if call_str == 'fun1':
        print(s.fun1())
    elif call_str == 'fun2':
        print(s.fun2())
    elif call_str == 'fun3':
        print(s.fun3())
    else:
        print("404 not Found")
    
        
    if hasattr(s, call_str):    # 判断是否存在函数 call_str,这样处理就不会报错了。
        obj = getattr(s, call_str)
        print(obj())
    else:
        print("404 not Found")

      3.3 setattr函数:为对象添加变量或方法

    def abc(self):
        print("%s正在交谈"%self.name)
    
    class Person(object):
        def __init__(self,name):
            self.name = name
    
    class Person(object):
        def __init__(self,name):
            self.name = name
        def talk(self):
            print("%s正在交谈"%self.name)
    
    p = Person("laowang")
    setattr(p,"talk",abc)   # 将abc函数添加到对象中p中,并命名为talk
    p.talk(p)               # 调用talk方法,因为这是额外添加的方法,需手动传入对象
    
    
    setattr(p,"age",30)     # 添加一个变量age,复制为30
    print(p.age)            # 打印结果:30

      3.4 delattr函数:输出对象中的变量。注意不能删除方法

    class Person(object):
        def __init__(self,name):
            self.name = name
        def talk(self):
            print("%s正在交谈"%self.name)
    
    p = Person("laowang")
    
    delattr(p,"name")       # 删除name变量
    print(p.name)           # 此时将报错
  • 相关阅读:
    java 日期格式 毫秒 表示方法
    Java的框架是什么意思
    圣思源Java视频36节练习源码分享(自己的190+行代码对比老师的39行代码)
    预装win8的笔记本如何重装win7
    Word 2013 无法撤销操作的错误
    面试经验分享(跳槽季~~~❀)
    一些可能有点用处的C#开发经验
    电子设计解决方案透视
    突破限速
    当区块链遇上Rust
  • 原文地址:https://www.cnblogs.com/noah0532/p/10923290.html
Copyright © 2020-2023  润新知