场景
原始写法
假设现在有一个文件 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__
来实现