ကျွန်တော်တို့ ဒီနေ့တော့ python decorators ကို လိုရင်းပဲပြောသွားပါမယ်။အဲ့တော့ python decorators တွေကိုနားလည်ဖို့ဆို python function တွေအလုပ်လုပ်ပုံကိုသိထားသင့်ပါတယ်။ကျွန်တော်တို့ decorator ဆိုတာက function တစ်ခုကို သူ့ထဲကို ခေါ်လိုက်ပြီး အဲ့function ရဲ့ အလုပ်လုပ်ပုံကို ထပ်ပြီးပြင်ဆင်လို့ရအောင်လုပ်တာပါ။နည်းနည်းရှုပ်သွားမလား။
ဥပမာ ကျွန်တော်တို့ function က Hello World လို့ထုတ်ပေးတယ်ဆို Hello World.How are you?လို့ အလိုလိုပြောင်းသွားအောင် လုပ်ပေးနိုင်ပါတယ်။function ရဲအလုပ်ကို ပြင်ဆင်လို့ရတယ်လို့ဆိုလိုတာပါ။အောက်က example ကိုကြည်လိုက်ပါ။
def my_decorator(wrap_function):
def do_decorator_function(*args,**kwargs):
return "{}How are you?".format(str(wrap_function()))
return do_decorator_function
def echo():
return "Hello World!"
print(echo())
ကျွန်တော်တို့ ဒီမှာ my_decorator ဆိုတဲ့ decorator ကိုကြေညာထားပါတယ်။သူ့အထဲက wrap function ကတော့ ကျွန်တော်တို့ပို့ပေးလိုက်မယ့် functionပါ။ကျွန်တော်ပြောခဲ့သလို function တွေကို modify လုပ်ပေးလို့ရတယ်ဆိုမှတော့ အဲ့function ကိုထည့်ပေးလိုက်မှအဆင်ပြေမှာပါ။သူ့အောက်က do_decorator_functionကတော့ decorator ထဲမှာပဲ အလုပ်လုပ်တာပါ။အဲ့တော့ အပေါ်က example ကိုrunလိုက်ရင် function ရဲ့ output ဖြစ်တဲ့ Hello World ကိုပဲတွေ့ရမှာပါ။
$ python decorators.py
Hello World!
ကျွန်တော်တို့ decorator ကိုအောက်ကတိုင်း ထည့်ပေးလိုက်မယ်ဆိုရင်တော့
def my_decorator(wrap_function):
def do_decorator_function(*args,**kwargs):
return "{}How are you?".format(str(wrap_function()))
return do_decorator_function
@my_decorator
def echo():
return "Hello World!"
print(echo())
@my_decorator လေးက မိတ်ဆွေရဲ့ အောက်က function ကို wrap လုပ်လိုက်ပြီး wrap_function ထဲရောက်သွားပါတယ်။အဲ့တော့မှ do_decorator_function ကအလုပ်လုပ်ပြီး str(wrap_function()) လို့ခေါ်လိုက်တော့ နဂို function ကပြန်ပြီး Hello Worldကို {} ထဲကိုထည့်ပေးလိုက်ပါတယ်။return ကတော့ decorator ထဲမှာမို့ သူ့ရဲံအလုပ်လုပ်တဲ့ function ဖြစ်တဲ့ do_decorator_function ကိုပြန်ပေးလိုက်တာပါ။ဒါလေးပါပဲ။
$ python decorators.py
Hello World!How are you?
ကျွန်တော်တို့ ဥပမာ decorator ထဲကို argumentတွေထည့်ပေးချင်တယ်ဆိုရင်လဲ
def square(wrap_function):
def do_decorator_function(*args,**kwargs):
number = wrap_function(*args,**kwargs)
return number * number
return do_decorator_function
@square
def number(number):
return number
print(number(4))
ဒါကတော့နားလည်နေလောက်ပြီထင်ပါတယ်။*args,**kwargs ထည့်ပေးလိုက်တာနဲ့ အဆင်ပြေပါတယ်။4 က ရောက်သွားပြီး 4*4 ပုံစံဖြစ်သွားလို့မြှောက်ပြီးပြန်ပိုေ့ပးတာပါ။
$ python decorators.py
16
လက်ရှိ python micro webframworkဖြစ်တဲ့ flask တို့မှာလဲ တွင်တွင်ကျယ်ကျယ် သုံးနေကျပါတယ်။တကယ်အသုံးဝင်တာမို့ တင်ပေးလိုက်တာပါ။Flask ကိုြက်ည့မယ်ဆို သူ့ရဲ့ routing ကို decorators နဲ့ထိန်းထားပါတယ်။
@app.route('/home/')
def home():
return render_template('index.html')
အဲ့တော့ ‘/home/’ ဆိုတာလေးထည့်လို့ရအောင်ဘယ်လိုရေးထားတာလဲကို ဆက်ပြီးြက်ည့ရအောင်
def calc(choice):
if choice == "square":
def square(wrap_function):
def do_decorator_function(*args,**kwargs):
number = wrap_function(*args,**kwargs)
return number * number
return do_decorator_function
return square
elif choice == "plus":
def plus(wrap_function):
def do_decorator_function(*args,**kwargs):
number = wrap_function(*args,**kwargs)
return number + number
return do_decorator_function
return plus
@calc("plus")
def number(number):
return number
print(number(4))
ဒီလိုပုံစံလေးပါပဲ နောက်တစ်ဆင့်လေးပဲတိုးသွားတာပါ။return squareတို့ ပြန်ပေးရတာလေးပါပဲ။အားလုံးနားလည်မယ်ထင်ပါတယ် code ကြည့်လိုက်ယုံနဲ့ ကျေးဇူးတင်ပါတယ်။