Python:スタティックメソド @staticmethod

前回のクラスメソド @classmethod に続きましてスタティックメソド @staticmethonです。前回のを見てから、その流れでこちらを見ることをおすすめします。

こちらもまた、クラスをオブジェクト化していない場合に対するpythonの便利?機能です。

(1) @staticmethodをメソドの前行につけます。引数にselfは不要です。

(2) このメソドはクラスの外に丸ごと出してしまっても全く問題ありませんが、@staticmethodとしてクラスの内部に書くことによって、クラスPersonの仲間なんだよという意思を表現することができます。

ぶっちゃけ、あんまり使おうとは思いませんが、色々な人のスクリプトを見ていると、出てきますので覚えた次第であります。

 

Python: クラスメソド @classmethod

クラスメソドをやっていきましょう。

普通のクラスと使い方

インスタンス(オブジェクト)を作るときに、カッコを付けるのが普通ですが、カッコをつけない場合は、アトリビュートにアクセスできなくなります。

オブジェクト内のグローバル変数的な意味合いのある”クラス変数”にはアクセスできます。

 

本題:クラスメソド @classmethod

 

カッコをつけてオブジェクト化していなくても、アトリビュートにアクセスできるようにクラスメソドを使います。

やり方:

(1)メソドの前行に @classmethod とマーキングする。

(2)メソドの引数self を clsに変更する。cls = classの意味

kenji3はクラスのままでオブジェクト化されていませんが、@classmethodでマーキングしたメソドはちゃんと使えるようになりました。

次回はスタティックメソド @staticmethod をやってみます。

IOT:Pythonでよく使う基本操作

やっていきましょう

list系

li=[] #リストの初期化でよく使う表現

li.append(1)#アペンドします。()内の値またはリストを元リストにそのままの要素で追加します。

li.extend([1,2,3,4])#エクステンドします。()内のリストを元リストに値として追加します。

li.pop(3)#ポップします。()内のリスト番号の要素を削除します。

li.sort()#リストを小さい値の順に並び変える。値のみのリストである必要がある。

li.insert(インデックス番号, オブジェクト)#指定インデックスの前にオブジェクトをインサートする

sqlist=[e**2 for e in li] #リスト内包表記です。liを一括変換するときに便利です。

tuple系

t=(1, 2, 3, 4, 5,3,5,3)

t.index(3)#()内の値があるリスト番号のうち、一番左側にあるリスト番号

dictionary系

dict={“me”: 1, “you”: 2, “him”: 3}

dict[“you”]#キー指定で値を得る

Python:デコレータ関数で機能追加

今日はデコレータをやっていきます。

既存のプログラムを使用しているときに、ちょっとこの関数に機能を追加したいなあ、なんて思ったことありませんか?

デコレータ追加前

引数xと引数yを足した数値を返す機能を”基本機能”と呼びましょう。

これに、機能を追加(デコレート)していきましょう。

デコレーターを使わない場合

その前に、このスクリプトに対して単純に機能を追加するならば下記のようになりますよね。print()という機能をresultを算出する前後に追加しました。

しかし、これではadd_numするたびに毎回print()→add_num→print()と3行書かなくてはなりません。

デコレータを使った場合

ここでデコレータの出番です。

デコレータの動きを解説

まず、通常の関数定義 def add_num(x, y): の前行に @deco とつけます。

このdecoという名称が、これから作る追加機能(デコレータ)の名称になります。(任意の名前で結構です)

@decoの前行に デコレータ関数定義 def deco(func):をします。

このdef decoの引数funcには、関数add_num実行時に@decoで指定されているので、add_numが入ってきます。

デコレータ関数decoはwrapperというものをreturnするようにしますが、このwrapperを デコレータ関数内のインナー関数として定義します。def wrapper():

引数にはタプルでもディクショナリでもどちらでも入るように、def wrapper(*args, **kwargs):にしておきます。

この中に、下記3行を書き実行します。この前後print文が今回追加した(デコレートした)機能です。ここのfuncの引数にも、入ってきた引数が何であれ全て受け入れます。つまり、そのまま返すということです。

print(‘関数実行の前に、何かの処理:足し算しますよー’)
result = func(*args, **kwargs)
print(‘関数実行の後に、何かの処理:終わりましたよー’)

これで、デコレータ関数の作成はおわりました。

実行

実行するときは

r=add_num(100,200)
print(r)

とすれば、add_numの基本機能の他にデコレータの追加機能も合わせて処理が行われます。

【実行結果】

  • 関数実行の前に、何かの処理:足し算しますよー #デコレータによる追加機能
  • 関数実行の後に、何かの処理:終わりましたよー #デコレータによる追加機能
  • 300  #基本機能