AOP面临着面向切割的编程。简而言之,它是将代码动态切入类的指定方法,而指定位置的编程想法是面向编程的编程。
指定类指定方法的代码片段称为剪切表面,称为哪些类和方法。这样,我们可以在切片中绘制几个代码代码,然后在需要时切入对象它的原始行为。
这种思想可以使原始代码逻辑更清晰,并且没有入侵原始代码。它通常用于权限管理,日志记录,事物管理等。
Python中的装饰器是一种众所周知的设计,经常在现场有剪切要求。
例如,Django中使用大量装饰来完成切割要求,例如权限控制,内容过滤,请求管理等。
Python Decorator是一种用于扩展原始功能的函数。目的是在不更改原始函数名称或类名称的情况下添加新功能。
让我知道如何与我一起使用装饰设备。
首先,有必要澄清一个概念:Python中的所有内容都是一个对象,并且该函数也是一个对象!
因此,可以在另一个函数中定义一个函数。查看以下示例:
从上面可以看出,因为函数是对象,它是:
然后,您可以返回函数对象。此函数对象在另一个函数中定义。由于范围是不同的,因此只能调用返回的函数。在功能中定义和分配的函数无法调用外部范围。
这意味着一个函数可以是另一个函数。
除了作为对象返回外,功能对象还可以将另一个函数传递给另一个函数:
好的,现在,基于功能的这些功能,我们可以创建一个装饰器来实现函数而无需更改原始功能。
例如,我们必须在函数执行之前和之后执行其他一些操作,因此根据上述功能可以作为参数传递,我们可以这样实现:
但是,在这种情况下,原始功能成为另一个函数。每个函数都添加到外层上的新功能层中。这样,原始呼叫将被修改。这显然是不便的,您会想到。
查看以下示例:
如上所述,我们可以将函数包装另一层并返回新函数作为对象。在这种方式上,该函数被更改和重新偿还,以便实现更改函数,并且该函数也用于调用。
但是,这样的写作非常不便,因为它需要偿还,因此在Python中,可以通过函数作为参数实现。
看看示例:
如上所述,该函数被实现为传递的参数,并且返回的函数被用作函数。这是一个简单的函数装饰。
如果该函数具有返回值,则更改函数还需要具有返回值,如下所示:
如上图所示:通过传输返回值,可以实现函数功能之前和之后的操作。但是您会发现问题,为什么输出在末尾打印出来?
因为这是返回的结果,实际上,该功能在此操作之前正在运行。它仅首先给出返回的结果,然后将其传递给,最后将其打印在底部。
那么如何使用参数执行功能?非常简单,具有参数的功能,我们返回的函数还必须带来参数。
查看以下示例:
但是又有一个问题。我编写了需要多个不同功能的装饰设备。这些功能的参数不同。那我该怎么办?简单,使用Harmony表示所有参数。
以下示例:
参数的问题如上所述,哇,很容易使用。没有问题吗?不!装饰装饰后,装饰的功能实际上已成为装饰功能中定义的功能,因此- 功能的数据都已更改!
以下示例:
可以发现该函数实际上是一个函数,这是一个问题。因此,如何解决它,有人会认为原始函数的元数据可以首先保存在装饰函数中,并且该功能在末尾的函数的元数据将谈论函数功能的功能。对于原始功能和返回,这确实是可能的!但是我们不这样使用,为什么?
由于Python长期以来一直想到了这个问题,因此它为我们提供了一种构建的方法,该方法是为了实现原始数据的保存和替换。哈哈,这与我们自己不同!
查看以下示例:
使用构建的装饰设备将原始功能用作装饰器参数,以实现该功能原始数据的保留和替换功能。
是的!装饰品也可以带来参数,当您查看装饰时,您会查看参数。哈哈,是的,装饰也可以带来参数,如何实现?
查看以下示例:
如上所示,这很简单。您只需要在原始装饰设备上打包一层,这等同于首先接收装饰参数,然后返回没有参数的装饰器,然后传递功能,最后返回更改更改。后者的功能。
这样,可以实现许多功能,因此可以根据传递给装饰的参数来实现不同的功能。
此外,有人可能会问,可以在同一功能上使用它吗?您是否使用多个装饰?答案是:是!
查看以下示例:
如上所示,当两个装饰器同时使用时,可以将它们想象成洋葱。下底部的装饰首先包装,然后完成装饰设备的上层以完成多层包装。然后在执行时,就像切洋葱一样。从最外层开始,只有在执行到装饰函数时,它才能到达下一个层。在功能之后,它就像切入洋葱的中间,然后向下,然后从内层开始,从内层开始,并依次执行到最外层。
例子:
装饰功能时,执行顺序如下图所示,这是相同的。
就功能性装饰师而言,许多人不清楚,因为可以实现装饰(如上所述),也可以通过类实现。由于功能和类都是对象,因此它们也可以用作装饰的对象,因此根据装饰物体,下面有四种情况:
让我们解释一下这四种情况的使用依次。
1.功能装饰功能
这是用于装饰功能的最常见装饰器,并返回功能。
2.类型的装饰功能
也就是说,装饰设备的功能是通过类实现的。
上面的表明,由功能定义的装饰设备更改为使用类以实现它。它仍然用于装饰功能,因为在类中,它仍然是最终返回的函数。
这是用装饰参数实现装饰的方法的方法。
如果装饰器没有参数,则可以删除该方法,但是在使用装饰时,需要这样使用,如下所示:
如上所述,使用类定义功能装饰器回答更方便,返回对象是函数,元数据保留。
3.功能装饰
关键点在这里。我们的普通装饰品用于装饰功能。返回的对象也是一个功能,装饰类也应装饰。
我不怕羞耻,我不知道如何实现完美的装饰设备。装饰性时,通常有两种方法:
返回一个函数以在执行创建实例之前和之后实现类,并正常返回此类实例。
如下:
如上所示,这是第一种方法。
4.类型的装饰类别
将其上述,返回类,并在创建实例之前和之后实现类,但是类已更改,并且创建的实例不再是原始类别的实例。
查看以下示例:
如上所述,您看到了吗?通过定义函数中的类并返回类,此函数仍然是类,但是在装饰设备之后,该类已成为类,并且生成的实例ISMethods使实例A的属性A是由该属性创建的属性班级,但是班级的元数据无法更改。
我个人不建议这种方法!
因此,我建议避免使用代码中的类别。如果您想在课堂上进行一些操作,则可以完全修改魔术方法,继承,元类别等。如果您无法避免,请仔细处理它。
如果您有更好的方法可以完美地实现装饰设备,请留言进行交流。
好的,这基本上可以完成装饰设备,并了解其原理,可以更好地使用和灵活使用。
原始:https://juejin.cn/post/7101493195212587039