RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1299715
Accepted
Muriam
Muriam
Asked:2022-06-28 13:46:01 +0000 UTC2022-06-28 13:46:01 +0000 UTC 2022-06-28 13:46:01 +0000 UTC

如何实现一个计算函数调用次数的装饰器?

  • 772

用一个简单的 python 代码示例进行解释。如何装饰一个计算函数调用次数的函数?同时,如何正确组合递增函数本身?

def f():
    counter = 0
    if (f):
        counter += 1
    return counter

问题补充:例如,我们先处理函数本身,没有装饰器。为什么函数执行后我得到“1”?毕竟,该函数被调用了 3 次。

def f():
    counter = 0
    if (f):
        counter += 1
    return counter

f()
f()
f()

result = f()

print(result)

闭包是指嵌套函数可以使用在该函数之外声明的变量。并且,函数完成后,变量的值将保留在内存中,不会被删除。而且,每次调用函数时,当我们每次传递不同的参数时,每次都会显示不同的值。

装饰器是一种在不更改其代码的情况下向另一个函数添加新功能的函数。它有点包装、装饰功能,从而扩展了它的功能。装饰器是一个接受另一个函数并返回一个函数(闭包)的函数。

python
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. CrazyElf
    2022-06-28T14:31:14Z2022-06-28T14:31:14Z

    counter是一个函数局部变量f,每次调用该函数时它都会被设置为零。如果要存储值,请编写一个类并使用类或实例变量来存储变量的状态。在这里,我正在使用该类的一个实例:

    class Counter:
        def __init__(self):
            self.counter = 0
        def increment(self):
            self.counter += 1
            return self.counter
    
    cnt = Counter()
    cnt.increment()
    cnt.increment()
    cnt.increment()
    
    result = cnt.increment()
    
    print(result) # 4
    

    您还可以为 counter 使用全局变量global counter,因此对于初学者来说通常更容易:

    def f():
        global counter
        counter += 1
        return counter
    
    counter = 0
    f()
    f()
    f()
    
    result = f()
    
    print(result) # 4
    

    但是全局变量“乱扔”在程序内存中,与OOP的原理不太兼容,一般来说,最好不要使用它们,而是将特定的功能委托给特定的类来实现这些功能。当你正确使用类时,你有点保证类只改变它的内部状态,而当你使用全局变量时,任何函数都可以改变任何全局变量,因此很难发现和诊断错误,找出哪个函数以及程序的状态在什么时候发生了变化。

    至于装饰器,我建议你把问题写清楚,因为装饰器已经被描述和分析过很多次了,如果你在现有的解释中有不明白的地方,请在问题中添加代码,并标记代码中难以理解的地方你。就像您对f问题中的功能所做的那样。

    • 2
  2. Best Answer
    Xander
    2022-06-28T17:02:44Z2022-06-28T17:02:44Z

    不,好吧,你当然可以通过装饰器:

    # Сам декоратор-счётчик
    
    def counter(func):
        
        def wrapper(*args, **kwargs):
            wrapper.count += 1
            return func(*args, **kwargs)
        
        wrapper.count = 0
        return wrapper
    
    
    # Функция, вызовы которой нужно считать
    
    @counter
    def f():
        print("Hello")
    
    
    f()
    f()
    f()
    
    print(f.count)
    

    但是,这仍然是一种变态。如果你有一些状态需要被记住然后访问,那么最合乎逻辑的方法是使用一个类。究竟如何-已经写在另一个答案中。

    • 2
  3. alex
    2022-06-28T17:24:06Z2022-06-28T17:24:06Z

    好吧,除了已经说明的所有内容之外,还有一个装饰器类的示例。

    #!/usr/bin/env python3
    # -*- encoding: utf-8 -*-
    #
    class Decorator:
        count = 0
    
        def __init__(self, fun):
            self._fun = fun
    
        def __call__(self, *args, **kwargs):
            self.count += 1
            return self._fun(*args, **kwargs)
    
    
    @Decorator
    def foo(a): ...
    
    
    foo()
    print(foo.count)
    
    • 2

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5