RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题

全部问题

Martin Hope
User New
Asked: 2020-02-01 02:21:34 +0000 UTC

为什么需要装饰器?(不是他们如何工作,而是为什么)

  • 10

为什么需要装饰器?

谁看过关于装饰器的经典解释:

# Декоратор - это функция, ожидающая ДРУГУЮ функцию в качестве параметра
def my_shiny_new_decorator(a_function_to_decorate):
    # Внутри себя декоратор определяет функцию-"обёртку".
    # Она будет (что бы вы думали?..) обёрнута вокруг декорируемой,
    # получая возможность исполнять произвольный код до и после неё.

    def the_wrapper_around_the_original_function():
        # Поместим здесь код, который мы хотим запускать ДО вызова
        # оригинальной функции
        print "Я - код, который отработает до вызова функции"

        # ВЫЗОВЕМ саму декорируемую функцию
        a_function_to_decorate()

        # А здесь поместим код, который мы хотим запускать ПОСЛЕ вызова
        # оригинальной функции
        print "А я - код, срабатывающий после"

    # На данный момент функция "a_function_to_decorate" НЕ ВЫЗЫВАЛАСЬ НИ РАЗУ

    # Теперь, вернём функцию-обёртку, которая содержит в себе
    # декорируемую функцию, и код, который необходимо выполнить до и после.
    # Всё просто!
    return the_wrapper_around_the_original_function

# Представим теперь, что у нас есть функция, которую мы не планируем больше трогать.
def a_stand_alone_function():
    print "Я простая одинокая функция, ты ведь не посмеешь меня изменять?.."

a_stand_alone_function()
# выведет: Я простая одинокая функция, ты ведь не посмеешь меня изменять?..

# Однако, чтобы изменить её поведение, мы можем декорировать её, то есть
# Просто передать декоратору, который обернет исходную функцию в любой код,
# который нам потребуется, и вернёт новую, готовую к использованию функцию:

a_stand_alone_function_decorated = my_shiny_new_decorator(a_stand_alone_function)
a_stand_alone_function_decorated()
#выведет:
# Я - код, который отработает до вызова функции
# Я простая одинокая функция, ты ведь не посмеешь меня изменять?..
# А я - код, срабатывающий после

接下来是一段话:

可能现在我们希望每次调用 a_stand_alone_function 时,调用 a_stand_alone_function_decorated。没有什么比这更简单的了,只需用 my_shiny_new_decorator 返回给我们的函数覆盖 a_stand_alone_function 即可:

a_stand_alone_function = my_shiny_new_decorator(a_stand_alone_function)
a_stand_alone_function()
#выведет:
# Я - код, который отработает до вызова функции
# Я простая одинокая функция, ты ведь не посмеешь меня изменять?..
# А я - код, срабатывающий после

那些。在这段之后 - 我们失去了以原始形式调用函数的机会。现在它总是装饰。

问题是,为什么那时需要装饰器?

1)为什么不(如果我们无论如何都失去了原来的功能)只是重写原来的功能?(只需在函数的开头和结尾添加我们需要的代码片段)。像这样:

def a_stand_alone_function():
    print "Я - код, который отработает до вызова функции"
    print "Я простая одинокая функция, ты ведь не посмеешь меня изменять?.."
    print "А я - код, срабатывающий после"

或者,如果附加代码很大并且应该单独保存,那么:

def a_stand_alone_function():
        pre_function()
        print "Я простая одинокая функция, ты ведь не посмеешь меня изменять?.."
        post_function()

2)为什么所有这些混乱,而不是像问题 1 那样提出一个简单的解决方案?

3)如果可以同时调用装饰函数和原始函数,我也会理解装饰器。但是用@写的装饰器不允许这样。为什么装饰器会覆盖原来的功能?

我将非常感谢您提供解释的答案,也许还有来自实际实践的清晰示例。

python
  • 3 个回答
  • 10 Views
Martin Hope
iGreetYou
Asked: 2020-01-26 15:08:15 +0000 UTC

Java泛型。Gen 和 Gen<?> 有什么区别

  • 10

我有通用的:

public class Gen<T> {
    private T value;

    public T getValue() {
        return value;
    }
}

和一些方法:

public void someMethod(Gen<?> gen) {
    System.out.println(gen.getValue());
}

someMethod如果方法参数的类型Gen不是,会有什么不同Gen<?>吗?

我知道元字符参数可以做extendsor super。

我是否正确理解 Gen 是一种解决遗留代码问题的方法?

java
  • 1 个回答
  • 10 Views
Martin Hope
Александр Пузанов
Asked: 2020-01-18 18:35:07 +0000 UTC

DataGridView + 第三方控件

  • 10

请告诉我,是否可以链接第三方控件DatagridView?特别是,RatingControl从DevExpress. 示例如下:

在此处输入图像描述

c#
  • 1 个回答
  • 10 Views
Martin Hope
JaminPeru
Asked: 2020-01-13 02:34:20 +0000 UTC

如何从 C++ 中的重载主体调用父方法?

  • 10

有一个类。它还有另一个类继承人。它覆盖父方法。

我有必要从继承者的重载方法中引发父方法。

怎么做?

class Foo{
 public:
    void example(){
        // Код родителя
    }
};

class Bar : public Foo{
 public:
    void example(){
        // Тут должен выполнится код родителя
        // А тут - код наследника
    }
};
c++
  • 1 个回答
  • 10 Views
Martin Hope
Majestio
Asked: 2020-01-05 08:55:53 +0000 UTC

使用 Qt for Android 的缺点

  • 10

我从未编写过 Android 应用程序。但是,粗略地阅读相关文献会让人认为使用 Java 以外的开发工具是低效的。

问:使用Qt和NDK开发的公开Android应用程序如何收集和发布,应该注意什么?每个处理器架构下单独收集?

android
  • 4 个回答
  • 10 Views
上一页
下一页

Sidebar

Stats

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

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 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