• 面向对象之反射


    一、 isinstance(obj,cls)和issubclass(sub,super)

    isinstance与issubclass是python的内置模块:

    • isinstance: 判断一个对象是否是另一个类的实例。
      - 如果是: True
      - 如果不是: False
    • issubclass: 判断一个类是否是另一个类的子类。
      - 如果是: True
      - 如果不是: False
    # isinstance
    class Foo:
        pass
    class Boo:
        pass
    
    foo_obj = Foo()
    boo_obj = Boo()
    
    print(isinstance(foo_obj, Foo))  # True
    print(isinstance(boo_obj, Foo))  # False
    
    #issubclass
    class Father:
        pass
    class Sub(Father):
        pass
    class Foo:
        pass
    
    print(issubclass(Sub,Father))  #True	
    print(issubclass(Foo,Father))  #False
    

    二、反射

    反射指的是通过 “字符串” 对 对象的属性进行操作。

    • hasattr: 通过 “字符串” 判断对象的属性或方法是否存在。

    • getattr: 通过 “字符串” 获取对象的属性或方法。

    • setattr: 通过 “字符串” 设置对象的属性或方法。

    • delattr: 通过 “字符串” 删除对象的属性或方法。

    注意: 反射的四个方法是python内置的。

    class Foo:
        def __init__(self,x,y):
            self.x = x
            self.y = y
    
    foo_obj = Foo(10,20)
    
    #hasattr 通过字符串x 判断对象中是否有 x属性
    print(hasattr(foo_obj,'x'))  #True
    print(hasattr(foo_obj,'z'))  #False
    
    #getattr 通过 字符串 获取对象的属性或方法
    print(getattr(foo_obj,'x'))  #10
    #若属性不存在,则返回默认值
    res = getattr(foo_obj,'z','默认值')
    print(res) #默认值
    
    #setattr
    # 为foo_obj设置一个属性z,值为30
    setattr(foo_obj,'z',30)
    print(hasattr(foo_obj,'z'))  #True
    
    #delattr
    delattr(foo_obj,'z')
    print(hasattr(foo_obj,'z'))  #False
    
    反射应用:
    
    class FileControl:
        def run(self):
            while True:
                #让用户输入上传或下载功能的命令:
                user_input = input('请输入 上传(upload) 或 下载(download):').strip()
                # 通过用户输入的字符串判断方法是否存在,然后调用相应的方法
                if hasattr(self,user_input):
                    func = getattr(self,user_input)
                    func()
                else:
                    print('输入有误')
        def upload(self):
            print('文件正在上传')
        def download(self):
            print('文件正在下载')
    filecontrol_obj = FileControl()
    filecontrol_obj.run()
    
  • 相关阅读:
    Next.js文档自定义App、Document,getInitialProps翻译
    使用fetch进行数据请求时报json错误
    菜单制作:ul li横向排列
    Django Auth组件->扩展用户
    001.Django_Model.整理
    PyCharm中的django项目的引入
    Css3 里的弹性盒的比例关系
    vue的组件通讯 父传子 -- 子传父-- 兄弟组件的传值 vue的组件传值
    新手如何创建一个vue项目 ---vue---新手创建第一个项目
    如何自学计算机前端开发?精细的自学步骤是什么样的?
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12143120.html
Copyright © 2020-2023  润新知