zoukankan      html  css  js  c++  java
  • 24. 面向对象-反射

    一、反射

    ​ python反射,核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! python的四个重要内置函数:getattr、hasattr、delattr和setattr较为全面的实现了基于字符串的反射机制,并且它们都是对内存中的模块进行操作,不会修改源文件。

    (1)hasattr(obj,name_str): 判断objec是否有name_str这个方法或者属性
    (2)getattr(obj,name_str): 获取object对象中与name_str同名的方法或者函数 
    (3)setattr(obj,name_str,value): 为object对象设置一个以name_str为名的value方法或者属性 
    (4)delattr(obj,name_str): 删除object对象中的name_str方法或者属性
    

    1、getattr()

    class Routing(object):
        def __init__(self):
            pass
    
        def login(self):
            print("这是登录页面")
    
        def logout(self):
            print("这是退出页面")
    
        def home(self):
            print("这是主页面")
    
        def run(self):
            inputUser = input("请输入url:").strip()
            func = getattr(Routing(), inputUser)
            func()
    
    
    if __name__ == "__main__":
        routing = Routing()
        routing.run()
    
    > 请输入url:home
    > 这是主页面
    

    2、hasattr()

    如果输入的url不存在,则报错。修改一下
    
    class Routing(object):
        def __init__(self):
            pass
    
        def login(self):
            print("这是登录页面")
    
        def logout(self):
            print("这是退出页面")
    
        def home(self):
            print("这是主页面")
    
        def run(self):
            inputUser = input("请输入url:").strip()
            if hasattr(Routing(), inputUser):
                func = getattr(Routing(), inputUser)
                func()
            else:
                print("404")
    
    
    if __name__ == "__main__":
        routing = Routing()
        routing.run()
        
    >请输入url:www.baidu.com
    >404
    

    3、setattr()

    def sing(self):
        print(f"{self.name}正在唱歌中")
    
    class User:
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print(f"{self.name}正在吃宵夜")
    
        def run(self):
            print(f"{self.name}正在跑步中")
    
    choice = input(">>>")
    user = User("panda")
    
    if hasattr(user, choice):
        func = getattr(user, choice)
        print(func)
    else:
        # 装饰一个方法或属性,这里装饰的是一个sing方法
        setattr(user, choice, sing)
        func = getattr(user, choice)
        func(user)
        
    > sing
    > panda正在唱歌中
    

    4、delattr()

    class User:
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print(f"{self.name}正在吃宵夜")
    
        def run(self):
            print(f"{self.name}正在跑步中")
    
    
    choice = input(">>>")
    user = User("panda")
    
    # 这里以删除name属性为例
    print(user.name)
    
    try:
        # 先判断属性是否存在,存在就删除
        if hasattr(user, choice):
            delattr(user, choice)
        else:
            pass
        print(user.name)
    except AttributeError:
        print(f"删除{choice}成功")
    
    >name
    >panda
    >删除name成功
    

    5、反射应用场景

    通过不同请求方式,调用不同函数
    
    import requests
    
    class Http(object):
        def get(self, url):
            res = requests.get(url)
            response = res.text
            return response
    
        def post(self, url):
            res = requests.post(url)
            response = res.text
            return response
    
    # 使用反射后
    url = "https://www.jianshu.com"
    method = input("请求方式:")
    http = Http()
    
    if hasattr(http, method):
        func = getattr(http, method)
        res = func(url)
        print(res)
    else:
        print("请求方式有误")
    
  • 相关阅读:
    SQL函数介绍,SDE函数
    [API]Google的语音识别API,支持各种语言
    (C#)Windows Shell 外壳编程系列8 同后缀名不同图标?
    (C#)Windows Shell 外壳编程系列8 同后缀名不同图标?
    获取某路径下,最后被修改的文件
    centos7下关闭防火墙
    linux下常用命令
    unittest断言
    **目录找出最后一次修改的文件(html结果),发送报告到指定qq邮箱
    unittest,requests,assertEqual实战演练
  • 原文地址:https://www.cnblogs.com/hq82/p/12611811.html
Copyright © 2011-2022 走看看