首页 > 代码库 > 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基础之反射