အခန်း ၃ ။ Object Oriented

Python ဟာ Object Oriented Programming Language တစ်ခုပါ။ နောက်လာမယ့် အခန်းမှာ Stack , Queue စတာတွေကို python ကို အသုံးပြုပြီး ရေးသားမှာ ဖြစ်သည့်အတွက်ကြောင့် OOP ကို အနည်းအကျဉ်းတော့ သိထားဖို့ လိုပါတယ်။ OOP အကြောင်းကို ပြောမယ်ဆိုရင်တော့ ဒီစာအုပ်မှာ မလောက်ပါဘူး။ ဒီစာအုပ်က programming အခြေခံအတွက် ဖြစ်တဲ့ အတွက်ကြောင့် နောက်အခန်းတွေ အတွက် OOP အကြောင်း အနည်းငယ်မျှသာ ဖော်ပြသွားပါမယ်။

Object Oriented ဆိုတာကတော့ programming ကို ရေးသားရာမှာ သက်ဆိုင်ရာ အစုလိုက် ခွဲထုတ်ပြီး ရေးသားထားတာပါ။ ဥပမာ။။ လူတစ်ယောက် ဆိုပါဆို့။ လူ ဟာ Object တစ်ခုပါ။ လူတစ်ယောက်မှာ ကိုယ်ပိုင် function တွေ ရှိမယ်။ ပိုင်ဆိုင်တဲ့ properties တွေ ရှိမယ်။ properties တွေကတော့ မျက်လုံး ၊ ပါးစပ် စတာတွေ ဖြစ်ပြီးတော့ function တွေကတော့ စကားပြောတာ အိပ်တာ စတာတွေပါ။

နောက်ထပ် နားလည်အောင် ထပ်ပြီး ရှင်းပြရရင်တော့ ကားတစ်စီးကို object လို့ သတ်မှတ်လိုက်ပါ။ သူ့မှာ ဘာ properties တွေ ရှိမလဲ။ ဘာ function တွေ ရှိမလဲ။ ရှိနိုင်တဲ့ properties တွေကတော့ ဘီး ၄ ခု ရှိမယ်။ တံခါး ရှိမယ်။ function တွေကတော့ ရှေ့သွားတာပါမယ်။ နောက်သွားတာပါမယ်။ ဘယ်ကွေ့ ညာကွေ့တွေ ပါမယ်။

Programming မှာ ဖန်တီးတဲ့ အခါမှာလည်း Object ကို ဖန်တီးတယ်။ ပြီးရင် properties တွေ function တွေကို သက်ဆိုင်ရာ Object မှာ ထည့်သွင်းပါတယ်။

Classes

Class ဆိုတာကတော့ object တစ်ခု ဖန်တီးဖို့ အတွက် user-defined လုပ်ထားတာပါ ။ class ထဲမှာ attributes , class varilables , method စတာတွေ ပါဝင်ပါတယ်။

Defining a Class

Python မှာ class ကို ဖန်တီးတော့မယ်ဆိုရင်

class ClassName:

ClassName ကတော့ နှစ်သက်ရာ class နာမည်ပါ။ ဥပမာ

class animal:

အဲဒါဆိုရင်တော့ animal ဆိုတဲ့ class တည်ဆောက်ပြီးပါပြီ။ ပြီးရင် class ထဲမှာ ပါဝင်မယ် variable ကို သတ်မှတ်ပါမယ်။ animal ဖြစ်တဲ့ အတွက်ကြောင့် ခြေထောက် ၄ ချောင်းဖြစ်နိုင်သလို ၂ ချောင်းတည်းရှိတဲ့ တိရစ္ဆာန်လည်း ဖြစ်နိုင်ပါတယ်။ ဒါကြောင့်

class animal:
    number_of_legs = 0

Instances

Class ကြီး သက်သက်ဆိုရင်တော့ class တစ်ခု ကို ဖန်တီးထားတာပဲ ရှိပါတယ်။ class ကို အသုံးပြုချင်ရင်တော့ instance တစ်ခုကို တည်ဆောက်ရပါတယ်။ တည်ဆောက်ပြီးသား instance ကို variable ထဲမှာ သိမ်းရပါတယ်။ class ထဲက variable တွေကို ခေါ်ယူ အသုံးပြုလိုရင်တော့ instance ဆောက်ထားတဲ့ varilable ထဲက နေ တဆင့် ခေါ်ယူ အသုံးပြုနိုင်ပါတယ်။

class animal:
    number_of_legs = 0

dog = animal()

အခု ဆိုရင် dog variable က animal object တစ်ခု ဖြစ်သွားပါပြီ။ animal ထဲက variable ကို ခေါ်ယူ အသုံးပြုလို ရင်တော့

dog.number_of_legs

အခု ကျွန်တော်တို့တွေ variable ကို အသုံးပြုကြည့်ရအောင်။

class animal:
    number_of_legs = 0

dog = animal()
dog.number_of_legs = 4

print ("Dog has {} legs".format(dog.number_of_legs))

''' 
you can also write like that

print("Dog has " + str(dog.number_of_legs) + " legs")
'''

အထက်ပါ code မှာ ''' နဲ့ စပြီးတော့ ''' နဲ့ ဆုံးထားတာကို တွေ့ရပါလိမ့်မယ်။ အဲဒီ နှစ်ခု ကြားမှာတော့ comment တွေ ရေးသားပါတယ်။ Multi line comment အတွက် ကျွန်တော်တို့တွေ ''' နဲ့ စပြီးတော့ ''' နဲ့ ဆုံးသည့် ပုံစံ ဖြင့်ရေးသားနိုင်ပါသည်။

နောက်ထပ် ဥပမာ တစ်ခု ထပ်စမ်း ကြည့်ရအောင်။

class animal:
    number_of_legs = 0

dog = animal()
dog.number_of_legs = 4

print ("Dog has {} legs".format(dog.number_of_legs))

chicken = animal()
chicken.number_of_legs = 2

print ("Chicken has {} legs".format(chicken.number_of_legs))

ကျွန်တော်တို့တွေ dog နဲ့ chicken object ၂ ခုကို တည်ဆောက်ပြီးတော့ ခြေထောက် ဘယ်နှစ်ချောင်း ရှိတယ်ဆိုတာကို print ထုတ်ပြပေးထားပါတယ်။

Function in Class

Function တွေကို class ထဲမှာ ကြေငြာလို့ ရပါတယ်။

class animal:
    number_of_legs = 0
    def sleep(slef) :
        print("zzz")

dog = animal()
dog.sleep()

class ထဲမှာ function ကို ဖန်တီးတဲ့ အခါမှာ (self) ဆိုပြီး ထည့်ထားတာကို တွေ့ရပါမယ်။ အဲဒီလို ထည့်ထားမှသာ class ထဲမှာ ရှိတဲ့ variable ကို လှမ်းခေါ်လို့ ရပါလိမ့်မယ်။

Constructor

class တစ်ခု စပြီး ဆောက်သည့် အခါမှာ တန်ဖိုးတွေကို ထည့်လိုက်ချင်တယ်။ ဒါမှမဟုတ် တန်ဖိုးတစ်ခုခု ကို ကြိုထည့်ထား မယ်ဆိုရင် def init(self) ကို အသုံးပြုနိုင်ပါတယ်။ ကျွန်တော်တို့က constructor လို့ ခေါ်ပါတယ်။

class animal:
    number_of_legs = 0
	
    def __init__(self):
        self.number_of_legs = 4

    def sleep(slef) :
        print("zzz")

dog = animal()
print ("Dog has {} legs".format(dog.number_of_legs))

ဒီ code မှာ ဆိုရင်တော့ Dog has 4 legs ဆိုပြီး ရပါလိမ့်မယ်။

အကယ်၍ ကျွန်တော်တို့က အခြား value ကို assign လုပ်ချင်တယ်ဆိုရင် အောက်ကလို ရေးနိုင်ပါတယ်။

class animal:
    number_of_legs = 0

    def __init__(self,legs = 4):
        self.number_of_legs = legs

    def sleep(slef) :
        print("zzz")

dog = animal()
print ("Dog has {} legs".format(dog.number_of_legs))
spider = animal(8)
print ("Spider has {} legs".format(spider.number_of_legs))


def __init__(self,legs = 4):

ဆိုတာကတော့ legs ကို default value အနေနဲ့ 4 ဆိုပြီး ပေးထားပါတယ်။ ဒါကြောင့်

dog = animal()

ခေါ်သည့် အခါမှာတော့ default value 4 နှင့် ဝင်သွားတာပါ။

spider = animal(8)

ဆိုသည့် အခါမှာတော့ legs က 8 ဆိုပြီး ဝင်သွားပါတယ်။

Inheritance

ပြီးခဲ့တဲ့ အခန်းကတော့ ကျွန်တော်တို့တွေ class အကြောင်း အနည်းငယ် သိပြီးပါပြီ။ အခု အခန်းမှာတော့ Inheritance အကြောင်း အနည်းငယ် ဖော်ပြပေးပါမယ်။

Inheritance ဆိုတာကတော့ အမွေဆက်ခံခြင်း တနည်းအားဖြင့် ပင်မ class ရဲ့ child class ဖန်တီးခြင်းပါပဲ။ ပြီးခဲ့တဲ့ အခန်းက animal class ကို ကျွန်တော်တို့ ဖန်တီးပြီးတော့ dog object တွေ ဆောက်ခဲ့ကြတယ်။ အခု ကျွန်တော်တို့ dog class ဖန်တီးပါမယ်။ dog ဆိုတာက animal ဆိုတဲ့ class ရဲ့ child ပါပဲ။

class animal:
    number_of_legs = 0

    def sleep(slef) :
        print("zzz")
    
    def count_legs(self) :
        print("I have {} legs".format(self.number_of_legs))
        
class dog(animal):
    def __init__(self):
        self.number_of_legs = 4

    def bark(self):
        print("Woof")

mydog = dog()
mydog.bark();
mydog.sleep();

ဒီ code မှာ ဆိုရင်တော့ Woff နဲ့ zzz ကို တွေ့နိုင်ပါတယ်။

dog class ဟာ သူ့ parent မှာ လုပ်လို့ရတဲ့ function တွေကို ခေါ်ပြီး အသုံးပြုနိုင်တာကို တွေ့နိုင်ပါလိမ့်မယ်။ ဒီ code မှာတော့ constructor မှာ self.number_of_legs = 4 ဆိုပြီး ထည့်ထားပါတယ်။ ဒါကြောင့် ခွေးဟာ ခြေ ၄ ချောင်း ဖြစ်တယ် ဆိုတာကို class ဆောက်ကတည်းက ပြောထားလိုက်တာပါ။

အခြား language တွေမှာတော့ class ရဲ့ function တွေကို private , public , protected ဆိုပြီး ပေးထားလို့ ရပေမယ့် python language မှာတော့ အဲဒီ feature မပါဝင်ပါဘူး။

Object Oriented နဲ့ ပတ်သက်ပြီးတော့ ဒီစာအုပ်မှာတော့ ဒီလောက်ပါပဲ။ နောက်ထပ် အခန်းတွေမှာ လက်တွေ့တည်ဆောက်ရင်းနဲ့ OOP ကို ပိုပြီး နားလည်လာပါလိမ့်မယ်။

လေ့ကျင့်ခန်း ၃

မေးခွန်း ၁။

ပေါင်းနှုတ်မြှောက်စား ပါဝင်သည့် MyMath class တစ်ခုကို တည်ဆောက်ပါ။

မေးခွန်း ၂။

MyMath class ကို base ယူပြီး MyMathExt ဆိုသည့် class ကို ဆောက်ပါ။ ၂ ထပ် ၊ ၃ ထပ် တွက်ရန် ထည့်သွင်းပါ။