首页 > 代码库 > Python基础之反射
Python基础之反射
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
#!/usr/bin/env python# _*_ coding:utf-8 _*_# Author: enzhi.wangclass Foo(object): def __init__(self,name): self.name = name def func(self): return "func"obj = Foo("Jack")
一、hasattr(object,name)->bool 判断object中是否具有name属性,例如:
# 检查对象中成员print(hasattr(obj,"name"))print(hasattr(obj,"func"))print(hasattr(obj,"age")) #检查一个没有的属性
以上代码执行结果为:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day7/反射2.pyTrueTrueFalse
二、getattr(object,name,default) -> 如果存在name属性(方法)则返回name的值(方法地址)否则返回default值。
# 获取成员print(getattr(obj,"name"))print(getattr(obj,"func"))
以上代码执行结果为:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day7/反射2.pyJack<bound method Foo.func of <__main__.Foo object at 0x0000000000B325F8>>
三、setattr(object,name,default)
def bulk(self): print("Foo.bulk")setattr(obj,"age",18)print(getattr(obj,"age"))setattr(obj,"talk",bulk) #obj.talk = bulkret = getattr(obj,"talk") #ret = obj.talkret(obj) #bulk里面没有self.name,把obj实例传进去,就获得了self.name
以上代码执行结果为:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day7/反射2.py18Foo.bulk
四、delattr(object,‘name‘)
# 删除成员delattr(obj,"name") #删除属性name,原值为‘Jack‘print(getattr(obj,"age"))
以上代码执行结果为:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day7/反射2.pyTraceback (most recent call last): File "C:/Users/root/PycharmProjects/S14/day7/反射2.py", line 34, in <module> print(getattr(obj,"age"))AttributeError: ‘Foo‘ object has no attribute ‘age‘
实例:利用反射实现动态的调用模块中的函数
fanshe/├── core│ ├── comments.py #comments模块内部封装了三个函数│ ├── __init__.py│ └── __pycache__│ │ ├── index.py #index模块调用comments模块└── __pycache__
1、comments模块中定义内容
#!/usr/bin/env python# _*_ coding:utf-8 _*_# Author: enzhi.wangdef login(): print("炫酷登录页面")def logout(): print("炫酷退出页面")def home(): print("炫酷的主页面")
2、index模块中内容
#!/usr/bin/env python# _*_ coding:utf-8 _*_# Author: enzhi.wangfrom core import commentsdef run(): inp = input("请输入要访问的URL") #用户输入一个函数名 if hasattr(comments,inp): #判断用户输入的成员是否存在 func = getattr(comments,inp) #获取成员 func() else: print("啊哦!您访问的页面不存在")run()
运行index.py
Python基础之反射
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。