新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、小程序设计、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了修文免费建站欢迎大家使用!这篇文章主要介绍关于Python中自省与反射的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
Python中的自省与反射
由于Python是一门强类型的动态解释型语言,故我们在某些时候并不会知道(特别是与别人对接开发工作的时候)对象中具有的属性与方法。
这个时候我们并不能直接通过 .或者查看底层的 __dict__ 方法来获得该对象下的属性与方法,我们需要使用一种更文明的方式来获取该对象下的属性与方法,故这种文明的方式被称之为反射。
自省和反射是两个比较专业化的术语,首先自省是获取对象的能力,而反射是操纵对象的能力。
Python中使用delattr()和setattr()实现反射,而其他方法则属于自省。
反射和自省常常组合使用!
Python中关于反射与自省的部分方法 | |
---|---|
常用方法 | |
dir() | 返回一个列表,存储该对象下能被 . 出的所有属性与方法。 |
hasattr() | 查看对象是否具有某种属性或方法,返回True或者False。 |
getattr() | 获取对象下的某一属性或方法。如被获取对象没有相应的属性或方法,则可以为其设置默认值。 |
setattr() | 设置对象下的某一属性的值,通常我们不会在对象外部为其新增某一方法,而是在在对象的类中进行设置。 |
delattr() | 删除对象中的某一属性或方法。 |
其他的一些方法 | |
help() | 获取对象的帮助信息,注意。没有返回值!内部会调用print()进行打印操作。 |
issubclass() | 判断一个类是不是另一个类的子类 |
isinstance() | 判断一个对象是否是一个已知的类型 |
id() | 返回存储对象的内存地址编号 |
callable() | 判断对象是否可调用 |
注意:于一切皆对象的原则,我们不仅可以对实例对象进行自省与反射,也可以对类对象进行自省与反射。
操作演示
应用场景
# ==== 这样做的好处是即使用户输入有误,也不会抛出异常 ==== import sys class DownloadAndUpload(object): def __init__(self): self.val = sys.argv[1] self.select() def download(self): print("正在下载...") def upload(self): print("正在上传...") def select(self): if hasattr(self,self.val): getattr(self,self.val)() else: print("没有该方法") DownloadAndUpload()