calendarcodediamondfacebookfingerglobalgoogleplushatenahomepagetopplainpocketrssservicetwitterwordpresshome2searchfoldernext-arrowback-arrowfirst-arrowlast-arrow

Python : デコレータは既存の関数に機能を追加する関数

デコレータを使うと、既存関数に対してコードの変更なしに処理を追加することができるようになる。デコレータを使うことによって、コードの重複を減らすことができる。

エンジニア速報は Twitter の@commteで 1 日 5 回配信しています。

Sponsored Link

デコレータのポイント

  • 既存の関数に機能を追加する関数
  • 関数を変数で扱うことにより、関数の引数や戻り値として扱うことができる
  • 変数のように参照させることができる
  • クラスをインスタンス化する必要がない
  • 関数やクラスの前に @ で始まる文字列を記述する

デコレータ

Python では関数内で関数を定義できる。外側の関数は内側の関数を呼び出して使う。

デコレータは、ある関数に対し、指定した関数を呼び出す。以下は、関数 b に対して 関数 a を追加している。

def a(x): def new_a(): print('before') x() # 元の関数を実行する print('after') return new_a @a def b(): print('middle') b() # before # middle # after

@staticmethod と @classmethod

@staticmethod と @classmethod もデコレータである。演算子@ を使い、メソッドの前にデコレータを並べる。このように定義すればクラスをインスタンス化する必要がない。以下はスタティックメソッドとクラスメソッドの例である。

class A: @staticmethod def s(): print('static') @classmethod def c(cls): print('class') A.s() # static A.c() # class

クラスメソッドはクラスに紐づくメソッドで、第一引数にクラスオブジェクトが渡される。 メソッドの一番上に @classmethod をつける。 第一引数は、self でなく cls とする。

@property(プロパティ)

インスタンスメソッドをあたかもインスタンス変数のように扱う機能を property(プロパティ)と呼ぶ。

class A: def __init__(self, x, y): self.x = x self.y = y @property # デコレータ(変数のように参照させる) def func(self): return self.x * self.y a = A(10, 20) a.func # 200

Python おすすめ本

スポンサード リンク

Comments

Leave a Comment

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください