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()

                              

  • 相关阅读:
    DPM(Deformable Part Model)原理详解(汇总)
    VS code配置docker的shell环境
    C++运算符重载规则
    typedef 和define的区别
    在ESP分区新建win10引导
    自动化学报投稿过程记录
    shell-grep命令详解(转)
    shell-sed命令详解(转)
    shell-命令行参数(转)
    sublimetext3-实用快捷键整理
  • 原文地址:https://www.cnblogs.com/wddxx/p/13671331.html
Copyright © 2011-2022 走看看