python之反射

什么是反射?
1、有时我们要访问某个变量或是方法时并不知道到底有没有这个变量或方法,所以就要做些判断。判断是否存在字符串对应的变量及方法。
2、我们知道访问变量时是不能加引号的,否则会被当成字符串处理。如果要通过字符串找到对应的变量,那该怎么办呢

反射就是用于解决上面两个问题而产生的,所谓反射,按我的理解就是反过来告诉我字符串是什么,是变量or方法

python中访问类或对象的成员有三种方法
##如下所示 obj 为对象 var为变量 func为函数
1、obj.var 或 obj.func()
2、obj.__dict__['var']
3、getattr(obj,'var')

反射有4个方法 getattr() hasattr() setattr() delattr()

举例子如下,一目了然

class A(object):
    gvar = 'min'
    def __init__(self,name,male):
        self.name = name
        self.male = male
    def func1(self):
        print "func1 :my name is %s" % self.name
    def func2(self):
        print "func2 :I'm a %s" % self.male

##实例化对象
obj = A('min','girl')
hasattr(obj,'gvar')
hasattr(obj,'func1')
getattr(obj,'gvar')
getattr(obj,'name')
getattr(obj,'func1')
getattr(obj,'func2')()
setattr(obj,'gvar','ben')
getattr(obj,'gvar')
delattr(obj,'gvar')
##python中一切事物都是对象,故其实上面的obj也是可以是类名,模块名
getattr(A,'func2')
hasattr(A,'func1')
示例代码

#当某个字符串就是模块名时,我们导入模块时可以用以下方法导入
mymodule = __import__(var) #这个就相当于导入模块var.py了

导入后,你可以在你的代码中用mymodule.*来调用该模块下的任意方法

 1 >>> class A(object):
 2 ...     gvar = 'min'
 3 ...     def __init__(self,name,male):
 4 ...         self.name = name
 5 ...         self.male = male
 6 ...     def func1(self):
 7 ...         print "func1 :my name is %s" % self.name
 8 ...     def func2(self):
 9 ...         print "func2 :I'm a %s" % self.male
10 ... 
11 >>> ##实例化对象
12 ... obj = A('min','girl')
13 >>> hasattr(obj,'gvar')
14 True
15 >>> hasattr(obj,'func1')
16 True
17 >>> getattr(obj,'gvar')
18 'min'
19 >>> getattr(obj,'name')
20 'min'
21 >>> getattr(obj,'func1')
22 <bound method A.func1 of <__main__.A object at 0x7f7b89f99a50>>
23 >>> getattr(obj,'func2')()
24 func2 :I'm a girl
25 >>> setattr(obj,'gvar','ben')
26 >>> getattr(obj,'gvar')
27 'ben'
28 >>> delattr(obj,'gvar')
29 >>> ##python中一切事物都是对象,故其实上面的obj也是可以是类名,模块名
30 ... getattr(A,'func2')
31 <unbound method A.func2>
32 >>> hasattr(A,'func1')
33 True

 

posted @ 2015-12-23 10:55  benric  阅读(2334)  评论(0编辑  收藏  举报