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

                              

  • 相关阅读:
    struts1.X的jar包
    struts2.1.6所需jar包详解
    hibernate的运行原理
    hibernate的save()方法详解
    flash的动态加载技术
    havok之内存管理
    worker中加载本地文件报错的解决方案
    行为树之我见
    havok之thread和memory system
    havok之collision detection
  • 原文地址:https://www.cnblogs.com/wddxx/p/13671331.html
Copyright © 2011-2022 走看看