วันจันทร์ที่ 27 กุมภาพันธ์ พ.ศ. 2560

9.91 การโอเวอร์โหลด python

9.91 การโอเวอร์โหลด

การโอเวอร์โหลด

                การโอเวอร์โหลด ได้กล่าวถึงในตอนการรับทอดไว้ก่อนแล้ว คือ มีลักษณะคล้ายคลึงกับโอเวอร์ไรด์ โดยลักษณะที่เหมือนกัน ได้แก่ ชื่อของเมท็อด ต้องมีชื่อเหมือนกัน ส่วนในด้านที่แตกต่างกัน คือ โอเวอร์โหลดจะต้องมีอาร์กิวเมนต์ที่มีจำนวนไม่เท่ากัน ส่วน    โอเวอร์ไรด์จะต้องมีจำนวนอาร์กิวเมนต์เท่ากันและรูปแบบเดียวกัน โอเวอร์โหลดอาจจะอยู่ในคลาสเดียวกันหรือไม่ก็ได้ แต่โอเวอร์ไรด์จะต้องมีคลาสที่สืบทอดกันมาจากคลาสแม่สู่คลาสลูก ให้พิจาณาตัวอย่างจากคำสั่งในภาพที่ 9.21

source code

class InterestAccount(Account):
    'InterrestAccount is a child class of Account'
    default_interest = 6.5

    def __init__(self, *args): # Overload constructor
        if(len(args)==0):
            self.balance = 0.0
            print "เปิดบัญชีอย่างเดียว"
        elif(len(args)==1):
            self.interest_rate = self.default_interest
            print "เปิดบัญชีพร้อมฝาก รับดอกเบี้ยปกติ"
        else:
            self.balance = args[0]
            self.interest_rate = args[1]
            print "เปิดบัญชีได้รับดอกเบี้ยพิเศษ"
ภาพที่ 9.21  ตัวอย่างการโอเวอร์โหลด

จากภาพที่ 9.21 เป็นตัวอย่างการโอเวอร์โหลดคอนสตรักเตอร์ ซึ่งได้ยกตัวอย่างไว้แล้วในตอนการรับทอด แต่ยังไม่ได้ให้รายละเอียด การโอเวอร์โหลดสามารถทำได้กับเมท็อดใด ๆ ก็ได้ ไม่จำเป็นต้องเป็นคอนสตรักเตอร์ การใช้งานนิยมนำมาใช้กับคอนสตรักเตอร์เป็นส่วนใหญ่ เพราะว่าเมื่อสร้างอ็อบเจกต์จะต้องมีการเรียกใช้คอนสตรักเตอร์อย่างอัตโนมัติทุกครั้ง การสร้างเมท็อดโอเวอร์โหลดในภาษาจาวาจะต้องสร้างเมท็อดขึ้นมาใหม่ ที่มีชื่อเดียวกัน แต่มีจำนวนอาร์กิวเมนต์ไม่เท่ากัน ซึ่งในภาษาไพธอนมีเงื่อนไขแตกต่างจากภาษาจาวา คือ ผู้ใช้ไม่จำเป็นต้องสร้างเมท็อดขึ้นมาซ้ำ เพียงแต่นำเอาชนิดข้อมูลแบบทูเพิลมาใช้ เขียนเงื่อนไขสอบถามจำนวนอาร์กิวเมนต์ แล้วจึงกำหนดให้อาร์กิวเมนต์แต่ละค่าไปประมวลผลอย่างไรก็ได้ภายในเมท็อดนั้น ๆ ด้วยตนเอง ซึ่งทำให้สะดวกมากยิ่งขึ้น จากตัวอย่างคำสั่ง สามารถอธิบายได้ดังตารางที่ 9.2

ตารางที่ 9.3  แสดงคำสั่ง คำอธิบายหรือการทำงาน
 คำสั่ง คำอธิบายหรือการทำงาน
 def  __init__(self, *args): เป็นคอนสตรักเตอร์ที่รองรับอาร์กิวเมนต์ได้หลายค่า
 if(len(args)==0): สร้างเงื่อนไขถ้าไม่มีอาร์กิวเมนต์เข้ามา
 self.balance = 0.0 กำหนดให้ balance = 0.0
 elif(len(args)==1): สร้างเงื่อนไขถ้ามี 1 อาร์กิวเมนต์
 self.balance=args[0] กำหนดให้อาร์กิวเมนต์เก็บในตัวแปร balance
 self.interest_rate=default_interest_rate นำตัวแปร default_interest_rate มาเก็บในตัวแปร interest_rate
 else: ถ้าเงื่อนไขเป็นเท็จ
 self.balance=args[0] ให้อาร์กิวเมนต์แรกเก็บในตัวแปร balance
 self.interest_rate=args[1] ให้อาร์กิวเมนต์ลำดับที่สองเก็บในตัวแปร interest_rate
        จากคำสั่งตัวอย่างที่กล่าวมา สามารถสร้างอ็อบเจกต์ได้ 3 วิธีด้วยกัน ได้แก่
                        1.  ไม่ใส่อาร์กิวเมนต์ใด ๆ เลย เช่น Taweerat = InterestAccount()
                        2.  ใส่อาร์กิวเมนต์ 1 ค่า เช่น Taweerat = InterestAccount(50000)
                  3.  ใส่อาร์กิวเมนต์ 2 ค่า เช่น  Taweerat = InterestAccount(50000,12)

การปฏิบัติการโอเวอร์โหลด

                        นอกจากการโอเวอร์โหลดตามหลักการ การเขียนโปรแกรมเชิงวัตถุแล้ว         ภาษาไพธอนยังมีเมท็อดต่าง ๆ ที่ยอมให้โปรแกรมเมอร์ ทำการโอเวอร์ไรด์เมท็อดที่ได้สร้างไว้ให้ใช้ ซึ่งมีฟังก์ชันอยู่มากมาย เช่น
                        __init__(self [,args…]), __del__(self), __str__(self), __add__(self),  __sub__(self), __mul__(self), __div__(self)  เป็นต้น

                        ต่อไปนี้เป็นตัวอย่างการประยุกต์ใช้การปฏิบัติการโอเวอร์โหลดไปใช้กับการบวก
ค่าทางเวคเตอร์

source code

class Vector:

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __str__(self):
        return 'Vector(%d, %d)'% (self.a, self.b)

    def __add__(self,other):
        return Vector(self.a + other.a, self.b + other.b)


v1 = Vector(12,20)
v2 = Vector(20,-5)
print v1 + v2
 
ภาพที่ 9.22  แสดงคำสั่งการปฏิบัติการโอเวอร์โหลด

        จากภาพที่ 9.22 เป็นคำสั่งการปฏิบัติการโอเวอร์โหลด โดยมีการสร้างคลาส ชื่อ Vector และมีคอนสตรักเตอร์ที่รับอาร์กิวเมนต์ได้ 2 ค่า คือ a และ b และมีเมท็อด __str__(self)  ทำหน้าที่แปลงเลขจำนวนให้เป็นตัวแปรประเภทสายอักขระ เมท็อดสุดท้าย คือ __add__(self)  ทำหน้าที่บวกค่าระหว่างค่า 2 ค่า มีอ็อบเจกต์ 2 อ็อบเจกต์ ได้แก่ v1 และ v2  เมื่อมีคำสั่ง print v1 + v2 โปรแกรมนำเอาอ็อบเจกต์ทั้งสองมารวมกัน สามารถนำไปประยุกต์กับการคูณ หาร บวก และลบ ได้ผลลัพธ์ของโปรแกรม ดังภาพที่ 9.23

output

>>>
Vector(32, 15)
>>> 
ภาพที่ 9.23  แสดงผลลัพธ์ของโปรแกรม

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Set MongoDB in the windows path environment

  Let’s set MongoDB in the windows environment in just a few steps. Step 1: First download a suitable MongoDB version according to your mach...