パイソンの30日間👨‍💻 - デコレータ


今日は面白い話題、デコレータを探った.Pythonでオブジェクト指向プログラミングを試みている間、私はデコレーターのカップルを適用しました@classmethod and @staticmethod , しかし、私はその時詳細にそれらを通過しませんでした.
デコレータはプログラミングパターンです.デコレータは、単に変装の機能です.
デコレータを使用すると、関数に追加機能を追加したり、スーパーを充電することが可能です.
私は、彼らがどのようにフードの下で働くか、そして、彼らがなぜ役に立つことができるかについて、私自身の明快な用語で説明しようとします.
クールなPythonライブラリの多くは、デコレーターの広範な使用を行い、それが魔法であるかのように感じることができます.しかし、デコレータを理解するためには、いくつかの概念を理解する必要がある.

一等市民としての機能
機能は、Pythonの一流の市民です.基本的には、他のデータ型と同様に関数を変数に割り当てることができ、他の値と同じように関数として渡すことができます.JavaScriptの世界でも、機能は似たような振る舞いをしています.
def multiplier(num1, num2):
  return num1 * num2

some_variable = multiplier # (a reference to the function is created)

del multiplier # (deletes the function)

print(some_variable(2,4)) # 8 (still able to call the function!)
この機能を値として渡す能力は、Pythonのデコレータの作成に不可欠です.

高次関数
関数は高次関数と呼ばれます.
  • 引数として別の関数を受け取ります(パラメータ)
  • 別の関数を返す
  • 両方
  • def logger(func, args):  # higher order function
        print(f'The result of the passed function is {func(*args)}')
    
    
    def sum(num1, num2):
        return num1 + num2
    
    
    logger(sum, (1, 5))
    
    def random(): # Higher order function
      def special():
        print('I am something special')
      return special
    
    random_value = random()
    random_value() # I am something special
    # One line way
    random()() # I am something special
    

    カスタムデコレータ
    さて、上記の原理を使用して、カスタムデコレータがどのように見えるかがここにあります
    def starmaker(func):
      '''
      A decorator function which accepts a function
      and then wraps some goodness into it and
      returns it back!
      '''
      def wrapper():
        func()
        print('You are a star now!')
        print('*********')
      return wrapper
    
    @starmaker
    def layman():
      print('I am just a layman')
    
    layman()
    
    StarMakerデコレータ機能は、素人機能に超大国を与えた.これは基本的に関数のラッパーを追加しました.さて、このDecorator @ starmakerは、どんな機能の上にでも加えられることができます、そして、その機能はスターになります!本当にクール.
    Pythonインタプリタは@decoratorname そしてリアルタイムで関数に変換して処理します.上記のコードは、@decorator 構文
    def starmaker(func):
      '''
      A decorator function which accepts a function
      and then wraps some goodness into it and
      returns it back!
      '''
      def wrapper():
        func()
        print('You are a star now!')
        print('*********')
      return wrapper
    
    def layman():
      print('I am just a layman')
    
    starmaker(layman)() # This is the underlying decorator magic!
    
    私が最初に非常に混乱したとき、私はデコレーターに遭遇しました.しかし、その根底にある原理を根絶した後、それは第二の天性になり、私は私の精神モデルに追加することができました.
    JavaScriptユニバースと比較すれば、JavaScriptは言語の一部としてデコレータを持っていません.しかし、JavaScriptのスーパーセットであるTypesScriptは、デコレータのこの概念を持っています.角のようなフレームワーク、NESTJSはデコレータに大きく依存します.
    デコレータ関数は引数を受け付けたり、渡された引数に基づいてカスタマイズすることもできます.
    def emojifier(func):
      def wrapper(emoji):
        # kwags are keyword arguments
        print(emoji)
        func()
      return wrapper
    
    @emojifier
    def random():
      pass
    
    random('😀') # 😀
    

    デコレータがなぜ有用か?
    デコレータは重要なプログラミングパターンであり、賢明に使用される場合、多くの利点を提供することができます.これは非常に再利用可能なコードを作成し、関数に追加機能をバインドするので、コードを乾燥させます.
    # Create an @authenticated decorator that only allows 
    # the function to run is user1 has 'valid' set to True:
    test_user = {
        'name': 'Jackson',
        'valid': True
    }
    
    another_user = {
      'name': 'Nathan',
      'valid': False
    }
    
    def authenticated(fn):
      def wrapper(*args, **kwargs):
        if args[0]['valid']:
          fn(args)
      return wrapper
    
    @authenticated
    def message_friends(user):
        print('message has been sent')
    
    message_friends(test_user) # message has been sent
    message_friends(another_user) # (Does nothing)
    
    上記の認証されたDecorator関数は、指定された条件に基づいてMessageRange Friends関数を呼び出します.これは、多くの柔軟性を与えて、ユーザーの認証の状態に基づいて条件つきの操作を実行します.
    Pythonのデコレータについてもっと知りたい参考文献
  • https://www.programiz.com/python-programming/decorator
  • https://realpython.com/primer-on-python-decorators/
  • 今日はこれで終わりです.明日、Pythonでのエラー処理技術について調べます.先のもう一つの重要な話題.
    その時まで
    すばらしいものを持ってください!