反射
2018-11-12 06:52:02来源:博客园 阅读 ()
一、反射
- 手动输入要运行的功能,反着去模块里找
二、相关函数
1. getattr(对象,属性(字符串形式))
- 从对象中获取属性
class Person: country = "China" def eat(self): print("-----eat-----") obj = Person() print(getattr(Person, "country")) # China # 类名.方法名(对象):方法调用的另一种方式 getattr(Person, "eat")(obj) # -----eat----- getattr(obj, "eat") # -----eat-----
2. hasattr(对象,属性(字符串形式))
- 判断对象中是否有该属性
class Person: country = "China" def eat(self): print("-----eat-----") obj = Person() print(hasattr(Person, "country")) # True print(hasattr(obj, "run")) # False
3. setattr(对象,属性(字符串形式),值)
- 如果属性存在,则更改属性的值
- 如果属性不存在,则新增属性,并把值赋给属性
class Person: country = "China" def eat(self): print("-----eat-----")
obj = Person() setattr(Person, "eat", 3) # 此时内存中函数eat变为eat = 3 obj.eat() # 报错
4. delattr(对象,属性(字符串形式))
- 删除对象中的属性
class Person: country = "China" def eat(self): print("-----eat-----") obj = Person() delattr(Person, "eat") obj.eat() # 'Person' object has no attribute 'eat'
注:以上四个函数都是对加载到内存中的代码进行操作的,并不会影响源代码
5.总结:
1)对于属性:
-
getattr(类名,属性(字符串形式)) ----->类.属性
-
getattr(对象,属性(字符串形式)) ----->对象.属性
-
setattr(类名,属性(字符串形式),值) ----->修改类属性的值
- setattr(对象,属性(字符串形式),值) ----->给对象添加属性
- delattr(类名,属性(字符串形式)) ----->删除对象属性
- delattr(对象,属性(字符串形式)) ----->报错,对象没有该属性
2)对于实例方法:
- getattr(类名,属性(字符串形式)(对象)) ----->调用实例方法
- getattr(对象,属性(字符串形式)()) ----->调用实例方法
- setattr(类名,属性(字符串形式),值) ----->如果属性名存在,则修改方法,类型根据值的类型,如果不存在,则新增。给类新增函数时,需要考虑函数形参个数,如果无形参,则用对象.函数名调用报错
- setattr(对象,属性(字符串形式),值) ----->如果属性名存在,则给对象添加属性,类型根据值的类型,如果不存在,则新增
- delattr(类名,属性(字符串形式)) ----->删除对象方法
- delattr(对象,属性(字符串形式)) ----->报错,对象没有该属性
三、应用
场景:如果已知py文件有哪些方法,但想测试各方法作用,摘一摘自己想用的内容
# master.py文件里内容: def run(): print("-----run-----") def eat(): print("-----eat-----") def drink(): print("-----drink-----")
代码:
import master from types import FunctionType while 1: gn = input("请输入你要测试的功能:") if hasattr(master, gn): # 如果master里面有你要的功能 # 获取这个功能,并执行 attr = getattr(master, gn) # 判断是否是函数,只有函数才可以被调用 if isinstance(attr, FunctionType): attr() else: # 如果不是函数, 就打印 print(attr)
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:MD5加密
- Python-17-反射 2019-07-24
- python 之 面向对象(反射、__str__、__del__) 2019-07-24
- python反射/issubclass&type&isinstance 2019-07-24
- 反射 2019-07-24
- 面向对象:接口思想、多态、鸭子类型、反射、内置方法、异常 2019-04-25
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash