面向对象-06-反射

'''
1.反射在模块中的应用: 假设此处有一个模块 handel 里面有f1,f2,f3三个函数
def f1():
print('f1')
def f2():
print('f2')
def f3():
print('f3')

import handel

while true:
print("您可以选择三个函数:
1.f1
2.f2
3.f3
")
val = input('请输入你要执行的函数:')

# hasattr是帮你查询handel模块中是否有对应val的函数或变量.
if hasattr(handler, val):
func = getattr(handel, val) #getattr是帮你在handel模块中,以字符串的形式查找所输入的val,对应的函数或变量.
func() 如此处若输入f1,则getattr会在handel中查找名为f1的函数或变量.
else:
print('你所输入的函数没有')

2.反射在类中的应用:
class Foo(object):
country = '中国'

def func(self):
print(123)
obj = Foo()

(1)# 当getattr的第一个参数为类时,表示在该类中以字符串的形式查找名为,第二个参数的函数或变量
v = getattr(Foo, 'func') # 查找Foo中的'func'函数,这句代码相当于 Foo.func 不带括号的
print(v) # 得到的是func函数的地址,要想执行函数还需要 v(obj)

(2)# 当getattr的第一个参数为对象时,表示在该对象的类中,以字符串的形式查找,名为第二个参数的函数或变量
v = getattr(obj, 'func') # 相当于obj.func()
print(v) #得到的是一个地址,要想执行还需 v() 这次不需要加对象

3.另外两个方法的补充:
setattr:根据字符串的形式,去动态的创建一个成员(都是在内存级别上进行的操作)
delattr:根据字符串的形式,去动态的删除一个成员(都是在内存级别上进行的操作)

import handel
v1 = setattr(handel, 'f4', lambda x:x+1) #在handel模块中创建一个函数'f4','f4'中的函数体为x:x+1
v2 = setattr(handel, 'a', 999) #在handel中创建一个变量a,a的值为999.
#需要注意的是不管是创建函数还是变量,在handel模块中是不会直接显示的,但他会存在与内存中,你若想查看也可以直接调用

v3 = delattr(handel, 'a') # 从内存中删掉handel中的'a',但不会表现在handel模块中,只是你今后无法再调用变量'a'了






'''
原文地址:https://www.cnblogs.com/gongteng/p/13567124.html