鱼C论坛

 找回密码
 立即注册
查看: 1359|回复: 7

[已解决]如何从外部传入函数名(python入门44课题2)

[复制链接]
发表于 2020-11-23 05:01:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼的答案是不是不应用于最新的3.9版python了?
def __init__(self,func,number),
在实例化类的时候,如果func初始值写的是字符串,则字符串无法最终成为函数名,self.func()实际无法调用。如果func值直接输入函数名,则是输入一个变量,该变量未被定义。
所以python如何才能在外部传入函数名到内部调用呢?
最佳答案
2020-11-23 08:35:35
因为func是函数名
报错一是因为你传入了一个字符串
报错二是因为你的变量名test没有被赋值
你需要先定义函数test
  1. def test():
  2.     print('I love FishC!')

  3. t1 = MyTimer(test)
复制代码
WeChat Image_20201122215424.png
WeChat Image_20201122215435.png
WeChat Image_20201122215431.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-23 08:10:43 From FishC Mobile | 显示全部楼层
把文本发出来,不要只发图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-23 08:35:35 | 显示全部楼层    本楼为最佳答案   
因为func是函数名
报错一是因为你传入了一个字符串
报错二是因为你的变量名test没有被赋值
你需要先定义函数test
  1. def test():
  2.     print('I love FishC!')

  3. t1 = MyTimer(test)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 19:03:04 | 显示全部楼层
本帖最后由 kleineweiss 于 2020-11-23 19:08 编辑
  1. 第一次发帖,这是个尝试发代码形式的贴
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 19:16:03 | 显示全部楼层
逃兵 发表于 2020-11-23 08:35
因为func是函数名
报错一是因为你传入了一个字符串
报错二是因为你的变量名test没有被赋值


谢谢!我尝试了先定义函数test但依旧报错(NameError: name 'test' is not defined)。
话说init应该是在类实例化后执行的第一个函数,在他运行的时候类里的函数都未被定义。所以还是不懂该如何能初始化时成功传入函数名
感谢您的回答!
附上代码:
  1. class MyTimer:
  2.     def test():
  3.         print('I love FishC!')
  4.         
  5.     def __init__(self, func, number=1000000):
  6.         self.prompt = "未开始计时!"
  7.         self.lasted = 0.0
  8.         self.default_timer = t.perf_counter
  9.         self.func = func
  10.         self.number = number
  11.    
  12.     def __str__(self):
  13.         return self.prompt

  14.     __repr__ = __str__

  15.     def __add__(self, other):
  16.         result = self.lasted + other.lasted
  17.         prompt = "总共运行了 %0.2f 秒" % result
  18.         return prompt

  19.     # 内部方法,计算运行时间
  20.     def timing(self):
  21.         self.begin = self.default_timer()
  22.         for i in range(self.number):
  23.             self.func()
  24.         self.end = self.default_timer()
  25.         self.lasted = self.end - self.begin
  26.         self.prompt = "总共运行了 %0.2f 秒" % self.lasted
  27.         
  28.     # 设置计时器(time.perf_counter() 或 time.process_time())
  29.     def set_timer(self, timer):
  30.         if timer == 'process_time':
  31.             self.default_timer = t.process_time
  32.         elif timer == 'perf_counter':
  33.             self.default_timer = t.perf_counter
  34.         else:
  35.             print("输入无效,请输入 perf_counter 或 process_time")

  36. t1 = MyTimer(test)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 19:20:28 | 显示全部楼层
wp231957 发表于 2020-11-23 08:10
把文本发出来,不要只发图片

谢谢您的回复,源代码我在楼下发出来啦。报错代码如下:
  1. >>> t1 = MyTimer(test())
  2. Traceback (most recent call last):
  3.   File "<pyshell#3>", line 1, in <module>
  4.     t1 = MyTimer(test())
  5. NameError: name 'test' is not defined
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 19:24:54 | 显示全部楼层
逃兵 发表于 2020-11-23 08:35
因为func是函数名
报错一是因为你传入了一个字符串
报错二是因为你的变量名test没有被赋值

等等,我好像懂您意思了。是在类之外定义test函数。然后在初始化类对象时,便有被定义过的变量名了是吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-24 09:12:16 | 显示全部楼层
kleineweiss 发表于 2020-11-23 19:24
等等,我好像懂您意思了。是在类之外定义test函数。然后在初始化类对象时,便有被定义过的变量名了是吗

是的没有错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 20:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表