鱼C论坛

 找回密码
 立即注册
查看: 1987|回复: 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
def test():
    print('I love FishC!')

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
def test():
    print('I love FishC!')

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

使用道具 举报

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


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

使用道具 举报

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


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

    __repr__ = __str__

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

    # 内部方法,计算运行时间
    def timing(self):
        self.begin = self.default_timer()
        for i in range(self.number):
            self.func()
        self.end = self.default_timer()
        self.lasted = self.end - self.begin
        self.prompt = "总共运行了 %0.2f 秒" % self.lasted
        
    # 设置计时器(time.perf_counter() 或 time.process_time())
    def set_timer(self, timer):
        if timer == 'process_time':
            self.default_timer = t.process_time
        elif timer == 'perf_counter':
            self.default_timer = t.perf_counter
        else:
            print("输入无效,请输入 perf_counter 或 process_time")

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

使用道具 举报

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

谢谢您的回复,源代码我在楼下发出来啦。报错代码如下:
>>> t1 = MyTimer(test())
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    t1 = MyTimer(test())
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, 2025-1-17 13:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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