场景
原始写法
假设现在有一个文件 tool.py 我想在外部输入一个 字符串 就调用这个字符串对应的函数 如果你不是用 __dict__ 这个好用的函数,那么你大概率会以下面的方式去写 main 函数,给很多 if 但是如果不只是两个函数,而是几十个函数,这么写不是人都要写废了么
"""
fileName: tool.py
@Time : 2022/12/11
@Author : Peinuan qin
"""
def sum ( a, b) :
return a + b
def sub ( a, b) :
return a - b
"""
fileName: main.py
@Time : 2022/12/11
@Author : Peinuan qin
"""
from tool import sum , sub
def main ( method_name, a, b) :
print ( )
if method_name == 'sum' :
return sum ( a, b)
else :
return sub( a, b)
if __name__ == '__main__' :
a = 1
b = 2
print ( main( 'sub' , a, b) )
升级写法
"""
fileName: main.py
@Time : 2022/12/11
@Author : Peinuan qin
"""
import tool
from pprint import pprint
def main ( method_name, a, b) :
pprint( tool. __dict__)
return tool. __dict__[ method_name] ( a, b)
if __name__ == '__main__' :
a = 1
b = 2
main( "sub" , a, b)
从这里能看出来,调用 tool.__dict__ 返回的内容是一个字典,字典的 key 是 tool.py 这个文件中定义或者内置的所有方法名,value 则是这个方法的对象。是可以直接调用的 ! 所以我们通过 tool.__dict__[method_name](a, b) 这样操作,就相当于我把名称输进去,返回给我的是那个函数,然后我在把参数 a,b 输进去,就可以直接得到返回值!是不是很方便很简洁
面向对象的写法
在这里,我把 sum 和 sub 封装到 Calculator 内部,同时为了比较,我们定义了一个成员方法 calculate 来实现上面的 main() 函数的作用。那这样的调用方法稍有不同 因为我们只能通过 类名.__dict__ 才能得到类中定义的方法对象,因此我们必须使用 Calculate.__dict__[method_name] 来得到成员方法,同时,由于我们的 sub 和 sum 都是 成员方法 是属于一个具体的 对象 的,因此我们同样应该把 self 作为参数传进去 这种情况下,如果 Calculator 里有 类方法 是没有办法通过 __dict__ 这种方式调用的
"""
fileName: tool.py
@Time : 2022/12/11
@Author : Peinuan qin
"""
class Calculator :
def __init__ ( self) :
pass
def sum ( self, a, b) :
return a + b
def sub ( self, a, b) :
return a - b
def calculate ( self, method_name, a, b) :
return Calculator. __dict__[ method_name] ( self, a, b)
@classmethod
def print_result ( cls, a, b) :
print ( a, b)
总结
__dict__ 这种方法可以针对一个 .py 文件中定义的方法使用,也可以针对 成员方法 使用对成员方法使用的时候,记得要把 self 关键字补上 对于 类方法 和 静态方法,不能通过 __dict__ 来实现