python学习之:妙用魔法函数 __dict___来调用对象中的方法,或者 python文件中的方法

文章目录

  • 场景
    • 原始写法
    • 升级写法
    • 面向对象的写法
  • 总结

场景

原始写法

  • 假设现在有一个文件 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__) # 打印一下 __dict__  的返回信息
    
    return tool.__dict__[method_name](a, b)
    

if __name__ == '__main__':
    a = 1
    b = 2
    main("sub", a, b)

python学习之:妙用魔法函数 __dict___来调用对象中的方法,或者 python文件中的方法_第1张图片

  • 从这里能看出来,调用 tool.__dict__ 返回的内容是一个字典,字典的 keytool.py 这个文件中定义或者内置的所有方法名,value 则是这个方法的对象。是可以直接调用的 !
  • 所以我们通过 tool.__dict__[method_name](a, b) 这样操作,就相当于我把名称输进去,返回给我的是那个函数,然后我在把参数 a,b 输进去,就可以直接得到返回值!是不是很方便很简洁

面向对象的写法

  • 在这里,我把 sumsub 封装到 Calculator 内部,同时为了比较,我们定义了一个成员方法 calculate 来实现上面的 main() 函数的作用。那这样的调用方法稍有不同
  • 因为我们只能通过 类名.__dict__ 才能得到类中定义的方法对象,因此我们必须使用 Calculate.__dict__[method_name] 来得到成员方法,同时,由于我们的 subsum 都是 成员方法 是属于一个具体的 对象 的,因此我们同样应该把 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):
    	# 只能通过这种方式调用 sum, sub 两个成员方法
        return Calculator.__dict__[method_name](self, a, b)

    @classmethod
    def print_result(cls, a, b):
        print(a, b)

总结

  • __dict__ 这种方法可以针对一个 .py 文件中定义的方法使用,也可以针对 成员方法 使用
  • 对成员方法使用的时候,记得要把 self 关键字补上
  • 对于 类方法静态方法,不能通过 __dict__ 来实现

你可能感兴趣的:(日常学习,Python学习笔记,python,学习,开发语言)