标签:反射 Foo obj self 面向对象 print foo True
一、 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()
标签:反射,Foo,obj,self,面向对象,print,foo,True 来源: https://www.cnblogs.com/wddxx/p/13671331.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。