zoukankan      html  css  js  c++  java
  • 面向对象之反射

    一、 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()
    
  • 相关阅读:
    Ubuntu下ATI显卡风扇转速调节脚本
    App_GlobalResources和LocalResources文件夹区别
    ubuntu下添加开机启动项
    UBUNTU安装PHP
    ubuntu apache2配置
    在ubuntu 上安装半透明玻璃窗口
    ASP.NET 页面:在此页面动态调用用户控件(.ASCX)
    Ubuntu 安装 LAMP 主机之后运行出现乱码
    Ubuntu下安装LMAP—菜鸟版
    Ubuntu 10.04风扇声音太大
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12143120.html
Copyright © 2011-2022 走看看