検索

Pythonデコレータの詳しい解説

Python デコレータの詳細分析

Python デコレータの詳細分析

何デコレータですか?

推奨学習: Python ビデオ チュートリアル

Python デコレータ (関数デコレータ) は、元の関数の機能を拡張するために使用される関数です。元の関数名(またはクラス名)を変更して、関数に新しい関数を追加します。

この関数の特別な点は、戻り値も関数であるということです。この関数は、「オリジナルの」関数が埋め込まれた関数です。

一般的に言えば、元の関数コードを拡張します。最も直接的な方法は、コードに侵入して変更することです。例:

import time
def f():
    print("hello")
    time.sleep(1)
    print("world")  

これは最もオリジナルな関数であり、合計を記録しようとします。この関数の実行時間を考慮すると、最も簡単な方法は元のコードを変更することです:

import time
def f():
    start_time = time.time()
    print("hello")
    time.sleep(1)
    print("world")
    end_time = time.time()
    execution_time = (end_time - start_time)*1000
    print("time is %d ms" %execution_time)

ただし、実際の作業では、コア コードを直接変更できない場合があるため、元のコードを変更せずに, we 別の関数を定義できます (ただし、有効にするために関数を再度実行する必要があります)

import time
def deco(func):
    start_time = time.time()
    f()
    end_time = time.time()
    execution_time = (end_time - start_time)*1000
    print("time is %d ms" %execution_time)
def f():
    print("hello")
    time.sleep(1)
    print("world")
if __name__ == '__main__':
    deco(f)
    print("f.__name__ is",f.__name__)
    print()

ここでは、パラメータが関数である関数 deco を定義し、埋め込みます。タイミング関数を this function に追加します。しかし、これらの数千万の関数の関数を拡張したい場合、

は deco() 関数を 1000 万回実行することを意味するため、これは理想的ではありません。それを達成するためにデコレータを使用してみてください。まず、デコレータの最もオリジナルな外観を見てください。

import time
def deco(f):
    def wrapper():
        start_time = time.time()
        f()
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print("time is %d ms" %execution_time )
    return wrapper
@deco
def f():
    print("hello")
    time.sleep(1)
    print("world")
if __name__ == '__main__':
    f()

ここでの deco 関数は、最もオリジナルなデコレータです。そのパラメータは関数です。

関数 f() をパラメータとして、戻り関数 Wrapper() 内で実行され、関数 f() の前に @deco を追加します。 ##f() 関数は注入されるのと同じです タイミング関数を使用すると、f() が呼び出される限り、関数は「より多くの関数を備えた新しい関数」、

に変換されます (注入する必要はありません)元の関数を繰り返します).

拡張 1: 固定パラメーターを使用したデコレーター

import time
def deco(f):
    def wrapper(a,b):
        start_time = time.time()
        f(a,b)
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print("time is %d ms" % execution_time)
    return wrapper
@deco
def f(a,b):
    print("be on")
    time.sleep(1)
    print("result is %d" %(a+b))
if __name__ == '__main__':
    f(3,4)

拡張 2: 固定パラメーターを使用しないデコレーター

import time
def deco(f):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        f(*args, **kwargs)
        end_time = time.time()
        execution_time_ = (end_time - start_time)*1000
        print("time is %d ms" %execution_time)
    return wrapper
@deco
def f(a,b):
    print("be on")
    time.sleep(1)
    print("result is %d" %(a+b))
@deco
def f2(a,b,c):
    print("be on")
    time.sleep(1)
    print("result is %d" %(a+b+c))
if __name__ == '__main__':
    f2(3,4,5)
    f(3,4)

拡張 3: を使用します。関数を装飾するための複数のデコレータ

import time
def deco01(f):
    def wrapper(*args, **kwargs):
        print("this is deco01")
        start_time = time.time()
        f(*args, **kwargs)
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print("time is %d ms" % execution_time)
        print("deco01 end here")
    return wrapper
def deco02(f):
    def wrapper(*args, **kwargs):
        print("this is deco02")
        f(*args, **kwargs)
        print("deco02 end here")
    return wrapper
@deco01
@deco02
def f(a,b):
    print("be on")
    time.sleep(1)
    print("result is %d" %(a+b))
if __name__ == '__main__':
    f(3,4)
'''
this is deco01
this is deco02
hello,here is a func for add :
result is 7
deco02 end here
time is 1003 ms
deco01 end here
'''

デコレータの呼び出し順序

デコレータは重ねて使用できるため、デコレータを使用した後のコードの順序はどうなりますか?

「 Python Sugar の @" 構文では、デコレーターが呼び出される順序は、@ 構文 Sugar を使用して宣言された順序の逆になります。

この例では、"f(3, 4) = deco01(deco02( f(3, 4)))"。

Python 組み込みデコレータ

Python には 3 つの組み込みデコレータがあります。クラスに関連するもの: staticmethod、classmethod、property 。

staticmethod はクラスの静的メソッドです。メンバー メソッドとの違いは、self パラメータがなく、クラスをインスタンス化せずに呼び出すことができることです。

クラスメソッドとメンバーメソッドの違いは、受け取った最初のパラメータがself(クラスインスタンスへのポインタ)ではなく、cls(現在のクラスの特定の型)であることです。

propertyはプロパティを意味し、次の情報を示します。クラス インスタンスを通じて直接アクセスできます

ここでは staticmethod と classmethod は紹介しませんので、例を通してプロパティを見てみましょう。

Pythonデコレータの詳しい解説Python の新しいスタイルのクラスの場合、上記の "@var.setter" デコレーターによって装飾されたメンバー関数が削除されると、Foo になることに注意してください。var 属性は読み取りです。 -only 属性であり、「foo.var = 'var 2'」を使用して値を割り当てると例外がスローされます。ただし、Python クラシック クラスの場合、宣言された属性は読み取り専用ではないため、「@var.setter」デコレータが削除されてもエラーは報告されません。

概要

この記事では、Python デコレーターの使用法をいくつか紹介します。デコレーターのコードは比較的理解しやすいものです。いくつかの例を通して実践すれば理解するのは簡単です。

以上がPythonデコレータの詳しい解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン