Python 之 反射解析

一. 简介

 python中的反射工能使由四个内置函数提供 hasatrr(查出是否有某成员),getattr(获取成员), setattr(设置成员), delattr (删除成员)。

二.应用

 

 1 #-*-coding:utf-8 _*_
 2 class reflect():
 3     def __init__(self):
 4         self.name = 'simple'
 5     def Bar(self):
 6         return 'Bar'
 7     def func(self):
 8         return 'func'
 9 
10 obj = reflect()   #创建一个对象
11 #检查是否有改成员, 有返回True  否则返回False
12 hasattr(obj,"name")
13 print (hasattr(obj,"name"))
14 #获取该成员的信息
15 getattr(obj,"name")
16 print (getattr(obj,"name"))
17 
18 #设置成员
19 setattr(obj,"age",22)
20 setattr(obj,"show",lambda num: num+1)
21 
22 #删除成员   不能删除里面的方法比如Bar
23 delattr(obj,"age")
24 delattr(obj,"name")
详细解析:      当我们要访问一个对象的成员时,应该是这样操作

 1 class Foo(object):
 2     def __init__(self):
 3         self.name = 'alex'
 4     def func(slef):
 5         return "func"
 6 obj = Foo()
 7 
 8 #访问字段
 9 obj.name               #  访问的是obj.name  变量名称
10 # 执行方法
11 obj.func()              #访问obj.func 表示去obj中或类中寻找变量名,并获取对应内存地址中的内容
请使用其他方式获取obj对象中的name变量指向内存中的值

 

 1 class Foo(object):
 2     def __init__(self):
 3         self.name = 'alex'
 4     def func(slef):
 5         return "func"
 6 obj = Foo()
 7 # 不允许使用obj.name
 8 print(obj.__dict__["name"])
 9 
10 #第二种方式
11 print(getattr(obj,"name"))
反射当前模块成员
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3  
 4 import sys
 5  
 6  
 7 def s1():
 8     print('s1')
 9  
10  
11 def s2():
12     print('s2')
13  
14  
15 this_module = sys.modules[__name__]
16  
17 hasattr(this_module, 's1')
18 getattr(this_module, 's2')
类也是对象
class Foo(object):
  
    staticField = "old boy"
  
    def __init__(self):
        self.name = 'wupeiqi'
  
    def func(self):
        return 'func'
  
    @staticmethod
    def bar():
        return 'bar'
  
print getattr(Foo, 'staticField')
print getattr(Foo, 'func')
print getattr(Foo, 'bar')
#!/usr/bin/env python
# -*- coding:utf-8 -*-
  
"""
程序目录:
    home.py
    index.py
 
home.py:
 
def dev():
    return 'dev'
 
  
当前文件:
    index.py
"""
  
import home as obj
  
#obj.dev()
  
func = getattr(obj, 'dev')
func()

 

posted @ 2017-08-28 16:57  lichenxi  阅读(210)  评论(0编辑  收藏  举报