• 售前

  • 售后

热门帖子
入门百科

python 实行函数的九种方法

[复制链接]
嘉熙莫多多ir 显示全部楼层 发表于 2021-10-26 13:36:49 |阅读模式 打印 上一主题 下一主题
目次


  • 方法一:直接调用函数运行
  • 方法二:使用偏函数来实行
  • 方法三:使用 eval 动态实行
  • 方法四:使用 getattr 动态获取实行
  • 方法五:使用类本身的字典
  • 方法六:使用 global() 获取实行
  • 方法七:从文本中编译运行
  • 方法八:使用 attrgetter 获取实行
  • 方法九:使用 methodcaller 实行

方法一:直接调用函数运行


这种是最简单且直观的方法
  1. def task():
  2.     print("running task")
  3. task()
复制代码
假如是在类中,也是云云
  1. class Task:
  2.     def task(self):
  3.         print("running task")
  4. Task().task()
复制代码
方法二:使用偏函数来实行


在 functools 这个内置库中,有一个 partial 方法专门用来生成偏函数。
  1. def power(x, n):
  2.     s = 1
  3.     while n > 0:
  4.         n = n - 1
  5.         s = s * x
  6.     return s
  7. from functools import partial
  8. power_2=partial(power, n=2)
  9. power_2(2)  # output: 4
  10. power_2(3)  # output: 9
复制代码
方法三:使用 eval 动态实行


假如你有须要动态实行函数的须要,可以使用 eval + 字符串 来实行函数。
  1. import sys
  2. def pre_task():
  3.     print("running pre_task")
  4. def task():
  5.     print("running task")
  6. def post_task():
  7.     print("running post_task")
  8. argvs = sys.argv[1:]
  9. for action in argvs:
  10.     eval(action)()
复制代码
运行效果如下
  1. $ python demo.py pre_task task post_task
  2. running pre_task
  3. running task
  4. running post_task
复制代码
方法四:使用 getattr 动态获取实行


若把所有的函数是放在类中,并界说成静态方法,那就不须要用 eval 了,接着使用 getattr 去获取并调用。
  1. import sys
  2. class Task:
  3.     @staticmethod
  4.     def pre_task():
  5.         print("running pre_task")
  6.     @staticmethod
  7.     def task():
  8.         print("running task")
  9.     @staticmethod
  10.     def post_task():
  11.         print("running post_task")
  12. argvs = sys.argv[1:]
  13. task = Task()
  14. for action in argvs:
  15.     func = getattr(task, action)
  16.     func()
复制代码
方法五:使用类本身的字典


我们都知道对象都有一个 __dict__() 的魔法方法,存放所有对象的属性及方法。
到这里,大家可以思索一下, 假如照旧上面的代码,我直接取实例的 __dict__() 能不能取到函数呢?
我信托许多人都会答错。
上面我们界说的是静态方法,静态方法并没有与实例进行绑定,因此静态方法是属于类的,但是不是属于实例的,实例虽然有使用权(可以调用),但是并没有拥有权。
因此要想通过 __dict__  获取函数,得通过类本身 Task,取出来的函数,调用方法和平时的也不一样,必须先用 __func__ 获取才气调用。
  1. import sys
  2. class Task:
  3.     @staticmethod
  4.     def pre_task():
  5.         print("running pre_task")
  6. func = Task.__dict__.get("pre_task")
  7. func.__func__()
复制代码
方法六:使用 global() 获取实行


上面放入类中,只是为了方便使用 getattr 的方法,实在不放入类中,也是可以的。此时你须要借助 globals() 大概 locals() ,它们本质上就是一个字典,你可以直接 get 来得到函数。
  1. import sys
  2. def pre_task():
  3.     print("running pre_task")
  4. def task():
  5.     print("running task")
  6. def post_task():
  7.     print("running post_task")
  8. argvs = sys.argv[1:]
  9. for action in argvs:
  10.     globals().get(action)()
复制代码
方法七:从文本中编译运行


先界说一个字符串,内容是你函数的内容,好比上面的 pre_task ,再通过 compile 函数编进 编译,转化为字节代码,最后再使用 exec 去实行它。
  1. pre_task = """
  2. print("running pre_task")
  3. """
  4. exec(compile(pre_task, '<string>', 'exec'))
复制代码
若你的代码是放在一个 txt 文本中,虽然无法直接导入运行,但仍然可以通过 open 来读取,最后使用 compile 函数编译运行。
  1. with open('source.txt') as f:
  2.     source = f.read()
  3.     exec(compile(source, 'source.txt', 'exec'))
复制代码
方法八:使用 attrgetter 获取实行


在 operator 这个内置库中,有一个获取属性的方法,叫 attrgetter ,获取到函数后再实行。
  1. from operator import attrgetter
  2. class People:
  3.     def speak(self, dest):
  4.         print("Hello, %s" %dest)
  5. p = People()
  6. caller = attrgetter("speak")
  7. caller(p)("明哥")
复制代码
方法九:使用 methodcaller 实行


同样照旧 operator 这个内置库,有一个 methodcaller 方法,使用它,也可以做到动态调用实例方法的效果。
  1. from operator import methodcaller
  2. class People:
  3.     def speak(self, dest):
  4.         print("Hello, %s" %dest)
  5. caller = methodcaller("speak", "明哥")
  6. p = People()
  7. caller(p)
复制代码
以上就是我总结的函数实行的十种方法,许多方法,大家也都知道,但是也有几个方法,险些是见不到的,尤其是背面使用 operator 库的那两种方法。
以上就是python 实行函数的九种方法的详细内容,更多关于python 实行函数的方法的资料请关注草根技术分享别的相关文章!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作