什么是反射?
1、有时我们要访问某个变量或是方法时并不知道到底有没有这个变量或方法,所以就要做些判断。判断是否存在字符串对应的变量及方法。
2、我们知道访问变量时是不能加引号的,否则会被当成字符串处理。如果要通过字符串找到对应的变量,那该怎么办呢
反射就是用于解决上面两个问题而产生的,所谓反射,按我的理解就是反过来告诉我字符串是什么,是变量or方法
python中访问类或对象的成员有三种方法
如下所示 obj 为对象 var为变量 func为函数1
2
31、obj.var 或 obj.func()
2、obj.__dict__['var']
3、getattr(obj,'var')
反射有4个方法 getattr() hasattr() setattr() delattr()
举例子如下,一目了然1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24class 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): |