面向对象之反射
一、 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()