Python类的反射实例
1、打开python开发工具IDLE,新建‘clsref.py文件’, 并写代码如下:
class Test():
def __init__(self,name):
self._name = name
def test1(self):
print ('test1')
t1 = Test('hello')
print (globals())

2、F5运行程序,打印出全局变量的字典,globals()函数就是这个作用,其中包含定义的Test类及t1对象

3、利用globals()函数实现反射,代码如下:
class Test():
def __init__(self,name):
self._name = name
def test1(self):
print ('test1')
t1 = Test('hello')
print (globals())
clz = 'Test'
fn = 'test1'
t2 = globals()[clz]('world')
fun = getattr(t2,fn)
fun()
globals()通过类名的key,定位到类地址,然后实例化t2对象,getattr获取对象的方法

4、F5运行程序,对象t2调用的test1()方法

5、也可以创建对象后直接使用getattr方法,代码如下:
class Test():
def __init__(self,name):
self._name = name
def test1(self):
print ('test1')
t1 = Test('hello')
f1=getattr(t1,'test1')
f1()
clz = 'Test'
fn = 'test1'
t2 = globals()[clz]('world')
fun = getattr(t2,fn)
fun()

6、F5运行程序,对象t1也调用的test1()方法

7、判断函数是否存在hasattr()方法,代码如下:
class Test():
def __init__(self,name):
self._name = name
def test1(self):
print ('test1')
t1 = Test('hello')
print (hasattr(t1,'test1'))
f1=getattr(t1,'test1')
f1()
clz = 'Test'
fn = 'test1'
t2 = globals()[clz]('world')
fun = getattr(t2,fn)
fun()

8、F5运行程序,打印出True,类Test存在test1()方法
