首页 > 编程语言 > 详细

python之反射

时间:2015-12-23 12:17:50      阅读:293      评论:0      收藏:0      [点我收藏+]

什么是反射?
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 :Im 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

 

python之反射

原文:http://www.cnblogs.com/benric/p/5069205.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!