TypeError: unorderable typesでハマったのでPythonのメソッド呼び出し方を調べてみた
TypeError at /hoge/
unorderable types: method() < method()
class A: def get_a(self): return self.count class B: def get_b(self): return self.count a = A() b = B() if a.get_a < b.get_b: # unorderable types: method() < method() ...
エラーの原因は、ただ単にメソッド呼び出し時に括弧がなかっただけ。
if a.get_a() < b.get_b():
こんな単純なミスで時間を取られたのが悔しかったので、このミスを単なるミスと放っておくのは勿体無い!ので、Pythonのメソッド呼び出し関係を調べてみました。
括弧無しの呼び出し
a.get_a
Aクラスのget_aという変数を呼び出している。
またはAクラスのget_aという関数そのものを指定している
→ この方法があるために、今回はシンタックスエラーが出ず、ミスの発見ができず時間を取られてしまった
Pythonではメソッド自身もオブジェクトである。
つまり、他の変数と変わりなく扱うことができる。
括弧有りの呼び出し
a.get_a()
Aクラスのget_aというメソッドを呼び出している。
メソッドを呼び出す際は、基本的に括弧が必要!
しかし、デコレータによって引数の括弧が省略可能。
デコレータは関数を引数とし、新しい関数を返します
def deco(func): print(‘deco’) @deco def hoge(): pass hoge # 括弧無しで呼び出し可能。deco と表示される
hoge = deco(hoge)
関数をデコレーションしている!
使い所がまだわかりません。デコレータのネストが可能らしいので、変更したくないメソッドの動きを変えるときとかに使うのでしょうか?