Super function

super() ဆိုတာ?

ရှင်းရှင်း ပြောရရင် Child Class (သား) ကနေ Parent Class (အဖေ) ရဲ့ Method တွေကို လှမ်းခေါ်သုံးတာ။

Bro စဉ်းစားကြည့်... Inheritance လုပ်လိုက်ရင် Parent ဆီက အကုန်ရတယ်ဆိုပေမယ့်၊ တစ်ခါတလေကျရင် Parent လုပ်တာကိုလည်း ယူချင်တယ်၊ ကိုယ်ပိုင်အသစ်လည်း ထပ်ဖြည့်ချင်တယ် ဆိုတဲ့ အခြေအနေမျိုး ရှိတယ်မလား။

အဲ့လိုအချိန်မှာ super() က ဝင်ပါလာပြီ။

Logic: အဖေ လုပ်နေကျအတိုင်း အရင်လုပ်ပေးပါ (Parent Code ကို Run ပါ)၊ ပြီးမှ ကျွန်တော် လုပ်ချင်တာ ဆက်လုပ်မယ် ဆိုတဲ့ သဘော။

ဥပမာ - Phone နဲ့ SmartPhone

ဒီဥပမာလေး နဲ့ ကြည့်ရအောင်။

  • Phone (Parent): ဖုန်းခေါ်လို့ရမယ်၊ brand နာမည်ရှိမယ်။
  • SmartPhone (Child): ဖုန်းလည်းခေါ်လို့ရမယ်၊ brand လည်းရှိမယ်... ဒါပေမယ့် သူ့မှာ wifi ဆိုတာ ပိုလာမယ်။

super() မပါရင် ဘာဖြစ်မလဲ၊ ပါရင် ဘာကွာမလဲ ကြည့်ကြမယ်။

၁။ super() မသုံးဘဲ ရေးရင် (အလုပ်ရှုပ်မယ်)

Without super() - Not Recommended
class Phone: def __init__(self, brand): self.brand = brand # ဒီ code ကို ပြန်ရေးရမယ် class SmartPhone(Phone): def __init__(self, brand, wifi): self.brand = brand # Parent မှာ ရေးပြီးသားကို ပြန်လိုက်ရေးနေရတယ် ပျင်းစရာကြီး self.wifi = wifi
ပြဿနာ: brand သတ်မှတ်တဲ့ code ကို Parent မှာ ရေးပြီးသားလေ။ အဲ့ဒါကို Child မှာ ပြန်ရေးနေရတာ Duplicate ဖြစ်တယ်။ အလုပ်မတွင်ဘူး။

၂။ super() သုံးပြီး ရေးမယ် Smart ကျကျ

With super() - Recommended
class Phone: def __init__(self, brand): print(f"Phone အမျိုးစား {brand} ကို ဖန်တီးနေပါပြီ...") self.brand = brand class SmartPhone(Phone): def __init__(self, brand, wifi): # ဟေ့ super()... အဖေ့ဆီက __init__ ကို အရင်သွား run ပေး လို့ ခိုင်းလိုက်တာ super().__init__(brand) # ပြီးမှ ကိုယ့်ဟာကိုယ် wifi ကို ထပ်ထည့် self.wifi = wifi print(f"Wifi ပါတဲ့ {self.wifi} စနစ်ကို ထည့်သွင်းပြီးပါပြီ။") # Run ကြည့်မယ် my_phone = SmartPhone("iPhone", "5G")

Output ဘာထွက်လာမလဲ?

Output
Phone အမျိုးစား iPhone ကို ဖန်တီးနေပါပြီ... Parent ရဲ့ Code အရင် run သွားတယ် Wifi ပါတဲ့ 5G စနစ်ကို ထည့်သွင်းပြီးပါပြီ။ ပြီးမှ Child ရဲ့ Code run တယ်

ဘာလို့ super() က အရေးပါတာလဲ?

1. Code ထပ်မရေးရတော့ဘူး (DRY - Don't Repeat Yourself):

Parent Class မှာ logic တွေ အများကြီး (ဥပမာ - Database ချိတ်တာ၊ Login စစ်တာတွေ) ရေးထားတယ်ဆိုပါစို့။ Child Class မှာ အဲ့ဒါတွေ ပြန်ရေးမနေနဲ့တော့။ super() နဲ့ လှမ်းခေါ်လိုက်ရုံပဲ။

2. Maintenance လွယ်တယ်:

တစ်နေ့ကျရင် Parent Class မှာ အပြောင်းအလဲ လုပ်လိုက်တယ်ဆိုပါစို့။ super() သုံးထားရင် Child Class တွေအကုန်လုံး အလိုလို လိုက်ပြောင်းသွားလိမ့်မယ်။ လိုက်ပြင်နေစရာ မလိုတော့ဘူး။

3. Extend လုပ်တာ:

Parent ရဲ့ အလုပ်ကို လုံးဝ ဖျက်ပစ်တာ (Override) မဟုတ်ဘဲ၊ Parent အလုပ်လည်း လုပ်မယ်၊ ပြီးမှ ကိုယ်ပိုင်အလုပ် ထပ်ဖြည့်မယ် (Extend) ဆိုတဲ့ နေရာမှာ The Best ပဲ။

လက်တွေ့ ဥပမာ: ရုံးတစ်ခုရဲ့ System

ဒီ System မှာ လူနှစ်မျိုးရှိမယ်။

  • User (သာမန်ဝန်ထမ်း): သူ့မှာ Name နဲ့ Email ပဲ ရှိမယ်။
  • Admin (မန်နေဂျာ): သူက User လည်း ဟုတ်တယ်။ ဒါပေမယ့် သူ့မှာ Access Level (ပါဝါ) ပိုရှိမယ်။

ဒီတော့ Admin အတွက် Code ရေးတဲ့အခါ Name နဲ့ Email ကို ပြန်ရေးမနေတော့ဘဲ super() နဲ့ User ဆီ လှမ်းပို့ခိုင်းလိုက်မယ်။

The Code

Code လေးကို ကြည့်ကြစို့၊ Comment နဲ့ ဘာတွေလုပ်သွားလဲ ရေးထားပေးတယ်။

User/Admin System Example
# ဒါက Parent Class (သာမန် User) class User: def __init__(self, name, email): self.name = name self.email = email print(f"User အသစ်ဆောက်ပြီးပါပြီ: {self.name} ({self.email})") def login(self): print(f"{self.name} is logging in...") # ဒါက Child Class (Admin) # Admin က User ဖြစ်တဲ့အတွက် User ကို အမွေယူလိုက်တယ် class Admin(User): def __init__(self, name, email, access_level): # ဒီနေရာက အသက်ပဲ Bro # Name နဲ့ Email ကိစ္စကို Parent (User) ဆီ ပို့ပြီး ရှင်းခိုင်းလိုက်တာ # ကိုယ်တိုင် self.name = name လို့ လိုက်ရေးစရာ မလိုတော့ဘူး super().__init__(name, email) # ပြီးမှ Admin နဲ့ဆိုင်တဲ့ ပါဝါကို သီးသန့် ထပ်ထည့်တာ self.access_level = access_level print(f"Admin Access Level '{self.access_level}' ကို သတ်မှတ်ပြီးပါပြီ။") # Admin မှာပဲ သုံးလို့ရမယ့် Function def delete_user(self): print(f"{self.name} က User တစ်ယောက်ကို ဖျက်လိုက်ပါပြီ။ (Admin Power!)") # --- Run ကြည့်ရအောင် --- print("--- Normal User တစ်ယောက် ဆောက်မယ် ---") staff = User("Maung Maung", "mgmg@company.com") # Output: User အသစ်ဆောက်ပြီးပါပြီ... print("\n--- Admin တစ်ယောက် ဆောက်မယ် ---") boss = Admin("U Ba", "uba@company.com", "SuperAdmin") # Output 1: User အသစ်ဆောက်ပြီးပါပြီ... (super() က Parent ကို အလုပ်လုပ်ခိုင်းလိုက်လို့) # Output 2: Admin Access Level... (ပြီးမှ Admin အလုပ် ဆက်လုပ်သွားတယ်) print("\n--- Action စမ်းကြည့်မယ် ---") boss.login() # Parent ဆီကဟာကို သုံးလို့ရတယ် boss.delete_user() # ကိုယ့်ဟာကိုယ်လည်း သုံးလို့ရတယ်

ဘာတွေ ဖြစ်သွားတာလဲ?

Bro မြင်တဲ့အတိုင်းပဲ Admin class ကို ဆောက်လိုက်တဲ့အချိန်မှာ...

  • super().__init__(name, email) လို့ ခေါ်လိုက်တာနဲ့ Python က ဪ... ဒါ User class ထဲက __init__ ကို အရင်သွား run ခိုင်းတာပဲ ဆိုပြီး User ဘက်ကို data တွေ ပို့ပေးလိုက်တယ်။
  • အဲ့တော့ User ဘက်က self.name နဲ့ self.email setup လုပ်တာကို အရင်လုပ်ပေးသွားတယ်။ Bro က Admin ထဲမှာ ထပ်ရေးစရာ မလိုတော့ဘူး၊ Code line သက်သာသွားပြီ။
  • အဲ့ဒါပြီးမှ self.access_level = access_level ဆိုတဲ့ Admin သီးသန့်အလုပ်ကို ဆက်လုပ်တယ်။
အနှစ်ချုပ်:
  • super() မပါရင်: Admin class ထဲမှာ self.name = name, self.email = email ဆိုပြီး အစကနေ ပြန်ရိုက်နေရမယ်။ Code တွေ ပွားကုန်မယ်။
  • super() ပါတော့: နာမည်နဲ့ အီးမေးလ်ကိစ္စ အဖေ (Parent) ရှင်းလိုက်၊ Access Level ကိစ္စ ကျွန်တော် (Child) ရှင်းမယ် ဆိုပြီး အလုပ်ခွဲလုပ်သွားတာ။ Smart ဖြစ်သွားတာပေါ့။

သတိထားရမယ့် အချက်

  • super() ကို အများအားဖြင့် __init__ method ထဲမှာ တွေ့ရအများဆုံးပဲ။ မွေးမွေးချင်း အဖေ့သွေးပါအောင် ထည့်လိုက်တဲ့ သဘောပေါ့။
  • ဒါပေမယ့် တခြား method တွေမှာလည်း သုံးလို့ရတယ်နော်။
  • ဥပမာ - Parent ရဲ့ save() method ကို လှမ်းခေါ်ပြီးမှ၊ Child မှာ log ဖိုင် ထပ်ရေးတာမျိုးပေါ့။

Note

Code အဓိပ္ပာယ်
super() ငါ့ရဲ့ Parent Class ကို ကိုယ်စားပြုတယ်။
super().__init__() Parent ရဲ့ မွေးစာရင်း (init) ကို အရင်လုပ်ပေးပါ လို့ ပြောတာ။
ဘယ်အချိန်သုံး? Parent ရဲ့ features တွေကို မပစ်ပယ်ချင်ဘူး၊ ဆက်သုံးချင်တယ်၊ ပြီးမှ အသစ်ထပ်ဖြည့်ချင်တဲ့အချိန်။

The end

super() ဆိုတာ အဲ့ဒါပါပဲ။ နည်းနည်းတော့ ရှုပ်ချင်စရာ ကောင်းပေမယ့်၊ လက်တွေ့ Code ရေးတဲ့အခါ Parent ဆီက Code တွေကို လှမ်းဆွဲသုံးချင်ရင် ဒါကို သတိရပါ။

OOP မှာ ဒီကောင်က တကယ် Hero ပဲ။