反射与约束

发布时间 2023-12-12 22:57:42作者: 我才是最帅的那个男人

一,反射

模块

 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))

二,约束