기사 파이썬 장식 모든 용도를 알 수 (권장 컬렉션)

 

(96) 
나는 파이썬 사랑을 배우고  
 1.8  2019년 5월 30일 16시 38분  단어 3071  읽기 164 개 2 리뷰

01. 장식 구문 설탕

당신이 몇 시간 동안 파이썬을 터치하면 다음 확실히 당신은 심볼은 구문 설탕 장식입니다 바로 @, @ 기호에 아무 낯선 사람 없습니다.

처음에 정의 된 함수에 배치,이 기능의 머리에 착용 모자처럼. 그리고 기능이 함께 결합합니다. 우리는이 함수를 호출 할 때, 제일 먼저이 기능을 수행하는 것이 아니라 매개 변수로이 기능은 자신의 머리, 우리가 장식 기능이나 장식을 호출 모자에에게 모자를 통과했다.

당신은 장식 기능을 달성 할 수 있는지 물어 싶어? 난 단지, 더 강력한 장식이 얼마나 당신의 두뇌에있는 구멍 큰 말할 수 있습니다.

사용 장식은 고정입니다 :

장식 기능 (모자) (클래스는 일부 기능을 달성하기 위해 사용될 수있다)을 정의

그리고 정의 비즈니스 기능 또는 클래스 (명)

머리의 남자와 마지막으로이 모자

간단한 사용 장식이 여기에 많은 두 가지 일반적인 인용.

프린터 로그

타이머

02. 시작 사용법 : 프린터 장치를 로그

먼저, 프린터 로그.

기능의 구현 :

함수를 실행하기 전에 로그의 첫 번째 인쇄 라인 소유자에 대해 알리기 위해, 나는 기능을 수행합니다.

실행 기능, 우리는 작업을 종료하고 우리하지만 정중 코드, 다음 주인을 알려주는 로그의 다음 줄을 인쇄 할 수 없습니다, 나는 실행을 위해 수행하고있다.

 

 

내 비즈니스 기능은 두 숫자의 합을 계산하는 경우. 후는 모자에 직접 서면.

 

 

그리고 우리는 그것을 계산.

(200,50)를 추가

무엇을 출력하지 마법을 오세요?

 

 


03. 사용을 시작하기 : 타이머를

타이머 봐

기능 : 이름이 암시 하듯이, 연산 기능을 수행하는 데 시간이다.

 

 

경우, 우리의 기능은 10 초 잠을하는 것입니다. 이 더 나은이 계산에서 볼 수있는 때 긴 결국 비행하지 않습니다.

 

 

출력을 살펴보십시오. 예수님은 정말 10 초입니다. 정말 해를 달력! ! !

 

 


04. 고급 사용법 : 매개 변수를 장식 기능

위의 간단한 항목으로, 당신은 아마 장식의 마법을 느꼈다.

그러나, 장식의 사용은 그보다 훨씬 더 많은 것이다. 오늘, 우리가 철저하게 지식을 홍보하는 것이 필수적이다.

上面的例子,装饰器是不能接收参数的。其用法,只能适用于一些简单的场景。不传参的装饰器,只能对被装饰函数,执行固定逻辑。

如果你有经验,你一定经常在项目中,看到有的装饰器是带有参数的。

装饰器本身是一个函数,既然做为一个函数都不能携带函数,那这个函数的功能就很受限。只能执行固定的逻辑。这无疑是非常不合理的。而如果我们要用到两个内容大体一致,只是某些地方不同的逻辑。不传参的话,我们就要写两个装饰器。小明觉得这不能忍。

那么装饰器如何实现传参呢,会比较复杂,需要两层嵌套。

同样,我们也来举个例子。

我们要在这两个函数的执行的时候,分别根据其国籍,来说出一段打招呼的话。

 

 

在给他们俩戴上装饰器的时候,就要跟装饰器说,这个人是哪国人,然后装饰器就会做出判断,打出对应的招呼。

戴上帽子后,是这样的。

 

 

万事俱备,只差帽子了。来定义一下,这里需要两层嵌套。

 

 

执行一下

 

 

看看输出结果。

 

 

emmmm,这很NB。。。

05. 高阶用法:不带参数的类装饰器

以上都是基于函数实现的装饰器,在阅读别人代码时,还可以时常发现还有基于类实现的装饰器。

基于类装饰器的实现,必须实现 __call__ 和 __init__两个内置函数。

__init__ :接收被装饰函数

__call__ :实现装饰逻辑。

 

 

执行一下,看看输出

 

 


06. 高阶用法:带参数的类装饰器

上面不带参数的例子,你发现没有,只能打印INFO级别的日志,正常情况下,我们还需要打印DEBUG WARNING等级别的日志。 这就需要给类装饰器传入参数,给这个函数指定级别了。

带参数和不带参数的类装饰器有很大的不同。

__init__ :不再接收被装饰函数,而是接收传入参数。

__call__ :接收被装饰函数,实现装饰逻辑。

 

 

我们指定WARNING级别,运行一下,来看看输出。

 

 


07. 使用偏函数与类实现装饰器

绝大多数装饰器都是基于函数和闭包实现的,但这并非制造装饰器的唯一方式。

事实上,Python 对某个对象是否能通过装饰器( @decorator)形式使用只有一个要求:decorator 必须是一个“可被调用(callable)的对象。

对于这个 callable 对象,我们最熟悉的就是函数了。

除函数之外,类也可以是 callable 对象,只要实现了__call__ 函数(上面几个盒子已经接触过了),还有比较少人使用的偏函数也是 callable 对象。

接下来就来说说,如何使用 类和偏函数结合实现一个与众不同的装饰器。

如下所示,DelayFunc 是一个实现了 __call__ 的类,delay 返回一个偏函数,在这里 delay 就可以做为一个装饰器。(以下代码摘自 Python工匠:使用装饰器的小技巧)

 

 

我们的业务函数很简单,就是相加

 

 

来看一下执行过程

 

 


08. 如何写能装饰类的装饰器?

用 Python 写单例模式的时候,常用的有三种写法。其中一种,是用装饰器来实现的。

以下便是我自己写的装饰器版的单例写法。

 

 

可以看到我们用singleton 这个装饰函数来装饰 User 这个类。装饰器用在类上,并不是很常见,但只要熟悉装饰器的实现过程,就不难以实现对类的装饰。在上面这个例子中,装饰器就只是实现对类实例的生成的控制而已。

其实例化的过程,你可以参考我这里的调试过程,加以理解。

 

09. wraps 装饰器有啥用?

在 functools 标准库中有提供一个 wraps 装饰器,你应该也经常见过,那他有啥用呢?

先来看一个例子

 

 

为什么会这样子?不是应该返回 func 吗?

这也不难理解,因为上边执行func 和下边 decorator(func) 是等价的,所以上面 func.__name__ 是等价于下面decorator(func).__name__ 的,那当然名字是 inner_function

 

 

那如何避免这种情况的产生?方法是使用 functools .wraps 装饰器,它的作用就是将 被修饰的函数(wrapped) 的一些属性值赋值给 修饰器函数(wrapper) ,最终让属性的显示更符合我们的直觉。

 

 

准确点说,wraps 其实是一个偏函数对象(partial),源码如下

 

 

可以看到wraps其实就是调用了一个函数update_wrapper,知道原理后,我们改写上面的代码,在不使用 wraps的情况下,也可以让 wrapped.__name__ 打印出 wrapped,代码如下:

 

 


10. 内置装饰器:property

以上,我们介绍的都是自定义的装饰器。

其实Python语言本身也有一些装饰器。比如property这个内建装饰器,我们再熟悉不过了。

它通常存在于类中,可以将一个函数定义成一个属性,属性的值就是该函数return的内容。

通常我们给实例绑定属性是这样的

 

 

但是稍有经验的开发人员,一下就可以看出,这样直接把属性暴露出去,虽然写起来很简单,但是并不能对属性的值做合法性限制。为了实现这个功能,我们可以这样写。

 

 

上面的代码设计虽然可以变量的定义,但是可以发现不管是获取还是赋值(通过函数)都和我们平时见到的不一样。

按照我们思维习惯应该是这样的。

 

 

那么这样的方式我们如何实现呢。请看下面的代码。

 

 

用@property装饰过的函数,会将一个函数定义成一个属性,属性的值就是该函数return的内容。同时,会将这个函数变成另外一个装饰器。就像后面我们使用的@age.setter和@age.deleter。

@age.setter 使得我们可以使用XiaoMing.age = 25这样的方式直接赋值。

@age.deleter 使得我们可以使用del XiaoMing.age这样的方式来删除属性。

property 的底层实现机制是「描述符」,为此我还写过一篇文章。

这里也介绍一下吧,正好将这些看似零散的文章全部串起来。

如下,我写了一个类,里面使用了 property 将 math 变成了类实例的属性

 

 

왜 기본 속성 프로토콜에게 그것을 설명 - 기반? 불행하게도, PyCharm 소스를 통해 속성을 입력하려면 클릭하지만 비슷한 의사 원본 문서와 동일한 및 구체적인 구현 논리가 없다.

그러나이 마법 기능 구조에서 더미 소스는 일반적으로 구현 로직을 알 수 있습니다.

여기에 자신의 클래스 속성 특성을 달성하기 위해 "기술자 계약"과 결합 된 구조를 모방하여 작동합니다.

다음과 같이 코드입니다 :

 

 

그런 다음 다음과 같이 학생 클래스, 우리는 또한 따라 변경

 

 

적은 조금 궁금해, 난 그냥 두 점을 왔어요 만들려고합니다 :

사용 TestProperty 장식 한 후, 수학은 더 이상 기능을하지만, 클래스 TestProperty의 인스턴스입니다. 그래서 두 번째 수학 함수는 본질적으로 두 번째 수학에 할당 TestProperty의 새로운 인스턴스를 생성 할 TestProperty.setter를 호출 math.setter을 장식하는 데 사용할 수 있습니다.

첫 번째와 두 번째 수학 수학 TestProperty 두 개의 서로 다른 인스턴스입니다. 그러나 그들은 모두 TestProperty .__ get__를 입력합니다, 수학의 가치에 있던 수학의 지정을 위해, TestProperty .__ set__를 입력합니다 같은 클래스 기술자 (TestProperty),에 속한다. 자세히 살펴보면, 사실, 마지막 방문 또는 학생 인스턴스를 속성 _math.

갖는은 여전히,보다 직관적 인 점을 실행되고 있다고 말했다.

 

 

이러한 위의 코드 문제의 학생을 실행하는 원칙으로, 그 2시 매우 중요한 이해하는 위의 두 명령을 결합해야합니다.

11. 다른 장식 : 장식 자 전투

읽고 위의 내용을 이해, 당신은 파이썬 마스터를 말할 수있다. 많은 사람들이 모르기 때문에 너무 많은 장식이 사용이있다, 자신감 점을 의심하지 마십시오.

제 생각에는, 데코레이터는 다음과 같은 목표를 달성 할 수있다 :

그리드 높은 힘 코드를 더 읽기 쉽게;

명확한 코드 구조를 덜 중복 코드;

나는 또한 당신이보고 감동하지 당분간 달성하기 위해 좋은 장식을 사용하여 장면에서 최근있다.

이는 제어 기능이 작동 제한 데코의 실현이다. 타임 아웃 경우, 시간 제한 예외가 발생됩니다.

볼 수 있습니다 관심.

 

 

추천

출처www.cnblogs.com/cheyunhua/p/10954448.html