とりあえず動いたので自分用メモ。そのうち編集するかも。
test.py
class UseOnlyClass(object):
def __init__(self, use_number1):
self.use_number1 = use_number1
def wraper(func):
def inner(main_inst):
# 処理1
use_only_class_inst = UseOnlyClass(main_inst.number1)
# 処理2
try:
func(main_inst, use_only_class_inst)
except Exception:
last_output = 100
else:
last_output = use_only_class_inst.use_number1 + 1
# 処理3
return last_output
return inner
class Selenium(object):
def __init__(self, number1, number2):
self.number1 = number1
self.number2 = number2
# この辺で接続処理(ログインなど)
def stop_program(self, last_number):
print(last_number)
class TargetSite(Selenium):
def __init__(self, number1, number2):
super().__init__(number1, number2)
@wraper
def update_something(self, use_only_class_inst):
# この辺でスクレイピング
# raise Exception
# スクレイピング結果を元に値を計算する
use_only_class_inst.use_number1 += 1 + self.number2
@wraper
def update_something_else(self, use_only_class_inst):
# この辺でスクレイピング
# raise Exception
# スクレイピング結果を元に値を計算する
use_only_class_inst.use_number1 += 2 + self.number2
main_inst = TargetSite(123, 456)
main_inst.stop_program(main_inst.update_something())
main_inst2 = TargetSite(123, 456)
main_inst2.stop_program(main_inst2.update_something_else())
やりたかったことは、
・あるサイトにスクレイピングをかける
・その処理前後でデータ処理をする
・このデータは別クラスのオブジェクトとして持っておく
・最後にprint文で処理後のデータを表示する
・その関数実行中にエラーが起こった際の処理を行う
もう少し詳しく言うと大きく分けて3つ処理がある
1. 別から呼ばれてきた値(上記の例だと123)を別クラスのメンバ変数化する
2. この値を利用してスクレイピングをかける
3. 1. の値と2. のスクレイピング結果により計算された値を出力する
UseOnlyClassとSeleniumクラスはどちらかがどちらかを継承していれば
もっと簡単に書けるのだが、現場の諸事情によりそれができない。
上記の例だと引数も2つだけになっているが現実にはもっと種類があり、
UseOnlyClassクラスのメンバ変数化して最終的に出力する値の計算に使いたいものもあれば、
TargetSiteクラスのメンバ変数だけにしておいて、サイト接続等にだけ使いたい値もある。