一、概述
getattr # 根据字符串为参数,去对象中找与之同名的成员。
hasattr # 根据字符串为参数,去判断对象中是否有与之同名的成员。
setattr # 根据字符串为参数,动态的设置一个成员(内存)
delattr # 根据字符串为参数,动态的删除一个成员(内存)
二、反射方法在模块中的应用
#handler.py f0 = 9 def f1(): print('F1') def f2(): print('F2') def f3(): print('F3') def f4(): print('F4') def f5(): print('F5') #run.py from types import FunctionType import handler while True: print(""" 系统支持的函数有: 1. f1 2. f2 3. f3 4. f4 5. f5 """) val = input("请输入要执行的函数:") # val = "f1" if hasattr(handler,val): func_or_val = getattr(handler,val) # 根据字符串为参数,去模块中寻找与之同名的成员。 print(func_or_val) if isinstance(func_or_val,FunctionType): func_or_val() else: print(func_or_val) else: print('handler中不存在输入的属性名')
# xx.py x1 = 123 def f1(arg): print(arg,666) #run.py import xx # getattr v1 = getattr(xx,'x1') v2 = getattr(xx,'f1') v2('杨森') # hasattr v3 = hasattr(xx,'x1') v4 = hasattr(xx,'f1') v4 = hasattr(xx,'f1') v5 = hasattr(xx,'xxxxxxx') print(v3,v4,v5) # setattr setattr(xx,'x2',999) v6 = getattr(xx,'x2') print(v6) # setattr(xx,'f2',lambda x:x+1) v7 = getattr(xx,'f2') v8 = v7(1) print(v8) # delattr delattr(xx,'x1') v9 = getattr(xx,'x1') print(v9)
三、反射方法在面向对象中的应用
简单事例:
class Foo(object): country = "中国" def func(self): pass v = getattr(Foo,'func') # Foo.func # 根据字符串为参数,去类中寻找与之同名的成员。 v1 = getattr(Foo,'country') print(v,v1) #<function Foo.func at 0x00000000022CE730> 中国 obj = Foo() v = getattr(obj,"func") # obj.func # 根据字符串为参数,去对象中寻找与之同名的成员。 v1 = getattr(Foo,'country') print(v,v1) #<bound method Foo.func of <__main__.Foo object at 0x000000000225DCF8>> 中国 # 注意:再类中寻找与参数同名的成员,如果原来的成员是一个方法,那么打印出来变成一个函数.
用反射方法完成简单的登陆、退出、注销功能:
class Account(object): func_list = ['login', 'logout', 'register'] def login(self): """ 登录 :return: """ print('登录111') def logout(self): """ 注销 :return: """ print('注销111') def register(self): """ 注册 :return: """ print('注册111') def run(self): """ 主代码 :return: """ print(""" 请输入要执行的功能: 1. 登录 2. 注销 3. 注册 """) choice = int(input('请输入要执行的序号:')) func_name = Account.func_list[choice-1] # func = getattr(Account,func_name) # Account.login # func(self) func = getattr(self, func_name) # self.login func() obj1 = Account() obj1.run()