一,反射
模块
1 f0 = 9 2 3 def f1(): 4 print('F1') 5 6 def f2(): 7 print('F2') 8 9 def f3(): 10 print('F3') 11 12 def f4(): 13 print('F4') 14 15 def f5(): 16 print('F5')
如果调用上面模块里的函数f1,f2,f3,f4,f5,可以使用if,即
1 """ 2 if val == 'f1': 3 handler.f1() 4 elif val == 'f2': 5 handler.f2() 6 elif val == 'f3': 7 handler.f3() 8 elif val == 'f4': 9 handler.f4() 10 elif val == 'f5': 11 handler.f5() 12 """
可以使用getattr
1 # by luffycity.com 2 from types import FunctionType 3 import handler 4 5 while True: 6 print(""" 7 系统支持的函数有: 8 1. f1 9 2. f2 10 3. f3 11 4. f4 12 5. f5 13 """) 14 val = input("请输入要执行的函数:") # val = "f1" 15 16 17 18 if hasattr(handler,val): 19 func_or_val = getattr(handler,val) # 根据字符串为参数,去模块中寻找与之同名的成员。 20 if isinstance(func_or_val,FunctionType): 21 func_or_val() 22 else: 23 print(func_or_val) 24 else: 25 print('handler中不存在输入的属性名') 26 27 # 正确方式 28 """ 29 if val == 'f1': 30 handler.f1() 31 elif val == 'f2': 32 handler.f2() 33 elif val == 'f3': 34 handler.f3() 35 elif val == 'f4': 36 handler.f4() 37 elif val == 'f5': 38 handler.f5() 39 """
除此之外还有另外三个,总结一下为:
getattr # 根据字符串的形式,去对象中找成员。
hasattr # 根据字符串的形式,去判断对象中是否有成员。
setattr # 根据字符串的形式,去判断对象动态的设置一个成员(内存)(添加时不会改变原来的模块文件,只会添加到内存中)
delattr # 根据字符串的形式,去判断对象动态的设置一个成员(内存)(删除时不会改变原来的模块文件,只会删除内存中)
总结一下什么后面可以加():
- 方法
- 函数
- 对象
1 def func(): 2 pass 3 4 5 class Foo(object): 6 def __call__(self, *args, **kwargs): 7 pass 8 def func(self): 9 pass 10 obj = Foo() 11 12 13 print(callable(func)) 14 print(callable(Foo)) 15 print(callable(obj)) 16 print(callable(obj.func))
二,约束

