面向对象之反射

一、 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()
posted @ 2020-01-03 08:58  Hank·Paul  阅读(180)  评论(0编辑  收藏  举报