python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author: enzhi.wang class 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.py True True False
二、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.py Jack <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 = bulk ret = getattr(obj,"talk") #ret = obj.talk ret(obj) #bulk里面没有self.name,把obj实例传进去,就获得了self.name
以上代码执行结果为:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day7/反射2.py 18 Foo.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.py Traceback (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.wang def login(): print("炫酷登录页面") def logout(): print("炫酷退出页面") def home(): print("炫酷的主页面")
2、index模块中内容
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author: enzhi.wang from core import comments def run(): inp = input("请输入要访问的URL") #用户输入一个函数名 if hasattr(comments,inp): #判断用户输入的成员是否存在 func = getattr(comments,inp) #获取成员 func() else: print("啊哦!您访问的页面不存在") run()
运行index.py
时间: 2024-10-11 20:44:53