คุณกำลังดำดิ่งสู่การเขียนโปรแกรม Python และคุณได้พบกับสิ่งที่น่าสนใจที่เรียกว่า "ความหลากหลาย" อาจฟังดูหรูหรา แต่เชื่อฉันเถอะ มันไม่ซับซ้อนอย่างที่คิด Polymorphism เป็นเรื่องของความยืดหยุ่นและการนำกลับมาใช้ซ้ำได้ในโค้ดของเรา มาดำดิ่งและไขปริศนาไปด้วยกัน

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

การพิมพ์แบบไดนามิกของ Python: ใน Python เรามีสิ่งดีๆ ที่เรียกว่า "การพิมพ์แบบไดนามิก" หมายความว่าวัตถุสามารถเปลี่ยนประเภทได้ในขณะที่โปรแกรมกำลังทำงาน พฤติกรรมแบบไดนามิกนี้คือสิ่งที่ทำให้ความหลากหลายใน Python ทรงพลังมาก เราสามารถสลับระหว่างวัตถุประเภทต่างๆ ได้อย่างง่ายดายและเขียนโค้ดที่สื่อความหมายได้มากขึ้น

ความแตกต่างทำงานอย่างไร? ความแตกต่างเกิดขึ้นได้จากสองแนวคิดหลัก: การสืบทอดคลาสและการเอาชนะวิธีการ

การสืบทอดคลาส: ด้วยการสืบทอดคลาส เราสามารถสร้างลำดับชั้นของคลาสได้ แต่ละคลาสสามารถสืบทอดคุณลักษณะและวิธีการจาก "ซูเปอร์คลาส" หรือ "คลาสพาเรนต์" ทั่วไป การสืบทอดนี้ช่วยให้เราแบ่งปันฟังก์ชันการทำงานทั่วไประหว่างคลาสที่เกี่ยวข้อง ในขณะที่ยังคงมีความยืดหยุ่นในการปรับแต่งพฤติกรรมเฉพาะในแต่ละคลาส

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

ตัวอย่างการปฏิบัติของความหลากหลาย:

พฤติกรรมที่เป็นนามธรรม:

ลองนึกภาพคุณมีหลายคลาสที่มีฟังก์ชันการทำงานบางอย่างร่วมกัน ด้วยการใช้ความหลากหลาย คุณสามารถกำหนดอินเทอร์เฟซทั่วไป (ชุดของวิธีการ) ที่คลาสเหล่านี้ควรใช้

  • ลองนึกถึงกลุ่มสัตว์ต่างๆ เช่น สุนัข แมว และนก แม้จะต่างกันแต่ก็สามารถส่งเสียงได้ ความหลากหลายทำให้เราปฏิบัติต่อพวกมันในลักษณะเดียวกัน ราวกับว่าพวกมันทั้งหมดอยู่ในกลุ่ม "สัตว์ทำเสียง" กลุ่มเดียวกัน เราสามารถมีกฎที่ว่า “ถ้าเป็นสัตว์ ให้ขอให้ส่งเสียง” ด้วยวิธีนี้ เราจะทำให้สัตว์ต่างๆ สร้างเสียงที่เป็นเอกลักษณ์ของตัวเองได้โดยไม่ต้องเขียนคำแนะนำแยกกันสำหรับสัตว์แต่ละตัว
class Bird:
  def sound(self):
    print('The bird goes tweet tweet')

class Cat:
  def sound(self):
    print('The cat meowed')

animal1 = Bird()
animal2 = Cat()

animal1.sound() #The bird goes tweet tweet
animal2.sound() #The cat meowed

การจัดการคอลเล็กชัน:

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

  • ลองนึกภาพคุณมีกล่องของเล่น และของเล่นแต่ละชิ้นก็ทำสิ่งที่แตกต่างออกไป แทนที่จะแยกของเล่นแต่ละชิ้นแยกกันและเล่นกับมันต่างกัน เราสามารถถือว่าของเล่นทั้งหมดเป็นของเล่นและเล่นด้วยกันได้ ความหลากหลายทำให้เรามีกฎที่บอกว่า “ถ้าเป็นของเล่น มาเล่นกันเถอะ!” ด้วยวิธีนี้ เราจึงสามารถสนุกสนานกับของเล่นต่างๆ ได้โดยไม่ต้องกังวลกับคุณสมบัติเฉพาะของของเล่นเหล่านั้น เราสามารถปฏิบัติต่อพวกเขาทั้งหมดในลักษณะเดียวกันโดยอิงจากธรรมชาติของ "ของเล่น" ที่พวกเขามีร่วมกัน
class Toy:
    def play(self):
        pass

class Car(Toy):
    def play(self):
        print("Vroom! I'm a fast car!")

class Robot(Toy):
    def play(self):
        print("Beep boop! I'm a dancing robot!")

class TeddyBear(Toy):
    def play(self):
        print("Hug me! I'm a cuddly teddy bear!")

# Create a collection of toys
toys = [Car(), Robot(), TeddyBear()]

# Play with each toy in the collection
for toy in toys:
    toy.play()

ในตัวอย่างข้างต้น เรากำหนดคลาสพื้นฐานที่เรียกว่า Toy ซึ่งมีวิธีการเล่น วิธีการเล่นมีไว้เพื่อแทนที่โดยคลาสย่อย จากนั้นเราจะสร้างคลาสย่อยของเล่นเฉพาะ เช่น รถยนต์ หุ่นยนต์ และตุ๊กตาหมี โดยแต่ละคลาสมีวิธีการเล่นของตัวเอง

ต่อไป เราสร้างคอลเลกชันที่เรียกว่าของเล่นซึ่งเก็บตัวอย่างสิ่งของของเล่นต่างๆ (รถยนต์ หุ่นยนต์ และตุ๊กตาหมี)

สุดท้ายนี้ เราจะวนซ้ำของเล่นแต่ละชิ้นในคอลเลกชันของเล่นและเรียกวิธีการเล่นของของเล่นแต่ละชิ้น นี่คือจุดที่ความหลากหลายเข้ามามีบทบาท แม้ว่าเราจะเรียกวิธีการเดียวกัน (เล่น) แต่วัตถุของเล่นแต่ละชิ้นก็มีพฤติกรรมแตกต่างกันไปตามการใช้งานของมันเอง ผลลัพธ์สุดท้ายคือ:

#Vroom! I'm a fast car!
#Beep boop! I'm a dancing robot!
#Hug me! I'm a cuddly teddy bear!

ระบบปลั๊กอิน:

ระบบปลั๊กอินเปรียบเสมือนการมีเครื่องมือต่าง ๆ ที่สามารถใส่ลงในช่องพิเศษในเครื่องได้ เครื่องมือแต่ละอันมีคุณสมบัติเฉพาะของตัวเอง แต่เครื่องมือทั้งหมดก็ปฏิบัติตามกฎหรือคำแนะนำเพื่อให้ทำงานได้อย่างถูกต้อง

ความหลากหลายนั้นมีประโยชน์เมื่อสร้างระบบปลั๊กอิน เนื่องจากเราสามารถกำหนดชุดกฎมาตรฐานหรืออินเทอร์เฟซที่ปลั๊กอินทั้งหมดควรปฏิบัติตาม อินเทอร์เฟซนี้สรุปวิธีการหรือการดำเนินการที่ปลั๊กอินควรมี เช่น “execute” หรือ “performTask”

ด้วยการยึดตามอินเทอร์เฟซนี้ ปลั๊กอินต่างๆ จึงสามารถใส่ลงในเครื่องได้อย่างง่ายดายโดยไม่ต้องเปลี่ยนโครงสร้างหลักของเครื่อง ผสานรวมและมอบคุณสมบัติเพิ่มเติมได้อย่างราบรื่นโดยไม่จำเป็นต้องแก้ไขโค้ดหลักของเครื่อง

เหมือนกับการมีชุดเครื่องมือที่ใช้แทนกันได้ซึ่งสามารถเพิ่มขีดความสามารถของเครื่องจักรได้โดยไม่ต้องสร้างใหม่ เราสามารถเสียบปลั๊กอินต่างๆ ได้ และปลั๊กอินเหล่านั้นจะทำงานได้เนื่องจากปลั๊กอินเหล่านี้ทำตามกฎชุดเดียวกัน ความยืดหยุ่นนี้ช่วยให้เราขยายฟังก์ชันการทำงานของแอปพลิเคชันของเราได้โดยไม่ต้องทำการเปลี่ยนแปลงโค้ดเบสหลักมากนัก

ดังนั้น ความหลากหลายในระบบปลั๊กอินคือทั้งหมดที่เกี่ยวกับการสร้างพื้นฐานทั่วไปหรือชุดคำสั่งที่ปลั๊กอินสามารถปฏิบัติตามได้ ทำให้ง่ายต่อการเพิ่มคุณสมบัติใหม่โดยไม่ยุ่งกับแกนหลักของโปรแกรม

  • ลองนึกภาพกล่องบล็อกสีสันสดใสที่สามารถต่อเข้าด้วยกันได้ แต่ละบล็อกมีรูปร่างและสีของตัวเอง ด้วยความหลากหลาย เราสามารถสร้างกฎที่ระบุว่า “หากเป็นบล็อก ก็สามารถเชื่อมต่อกับบล็อกอื่นได้” ซึ่งหมายความว่าเราสามารถผสมและจับคู่บล็อกต่างๆ เพื่อสร้างโครงสร้างที่เป็นเอกลักษณ์โดยไม่จำเป็นต้องใช้คำแนะนำพิเศษสำหรับแต่ละบล็อก เราสามารถมีบล็อกที่มีรูปร่างและขนาดต่างกันได้ แต่ทั้งหมดสามารถเชื่อมต่อเข้าด้วยกันได้เนื่องจากเป็นไปตามกฎเดียวกัน
class Block:
    def connect(self):
        pass

class BlueBlock(Block):
    def connect(self):
        print("Connecting the blue block...")

class RedBlock(Block):
    def connect(self):
        print("Connecting the red block...")

class YellowBlock(Block):
    def connect(self):
        print("Connecting the yellow block...")

# Create a collection of blocks
blocks = [BlueBlock(), RedBlock(), YellowBlock()]

# Connect each block in the collection
for block in blocks:
    block.connect()

ในตัวอย่างนี้ เรากำหนดคลาสพื้นฐานที่เรียกว่า Block ซึ่งมีวิธีการเชื่อมต่อ วิธีการนี้มีไว้เพื่อแทนที่โดยคลาสย่อย จากนั้นเราสร้างคลาสย่อยของบล็อกเฉพาะ เช่น BlueBlock, RedBlock และ YellowBlock โดยแต่ละคลาสมีวิธีการเชื่อมต่อของตัวเอง

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

สุดท้าย เราวนซ้ำแต่ละบล็อกในคอลเลกชันบล็อกและเรียกวิธีเชื่อมต่อในแต่ละบล็อก นี่คือจุดที่ความหลากหลายเข้ามามีบทบาท แม้ว่าเราจะเรียกใช้เมธอดเดียวกัน (เชื่อมต่อ) แต่ออบเจ็กต์บล็อกแต่ละรายการจะมีพฤติกรรมแตกต่างกันตามการใช้งานของตัวเอง ผลลัพธ์จะเป็น:

#Connecting the blue block...
#Connecting the red block...
#Connecting the yellow block...

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

การจัดการคอลเลกชันและระบบปลั๊กอินมีลักษณะคล้ายกันว่าให้อะไร

มาดูความแตกต่างที่ชัดเจนกัน:

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

ระบบปลั๊กอิน:ระบบปลั๊กอินที่ใช้ความหลากหลายนั้นเปรียบเสมือนการเพิ่มคุณสมบัติพิเศษให้กับโปรแกรมหลักโดยไม่ต้องเปลี่ยนรหัสหลัก เรากำหนดชุดกฎหรือข้อกำหนดที่คุณสมบัติพิเศษ (ปลั๊กอิน) เหล่านี้ควรปฏิบัติตาม ปลั๊กอินแต่ละตัวสามารถมีการนำกฎเหล่านี้ไปใช้ของตนเองได้ ซึ่งช่วยให้เราสามารถเสียบปลั๊กอินต่างๆ เข้ากับโปรแกรมหลักได้ และปลั๊กอินเหล่านี้ทำงานร่วมกันได้อย่างราบรื่นโดยปฏิบัติตามกฎชุดเดียวกัน มันเหมือนกับการเพิ่มเครื่องมือใหม่ลงในกล่องเครื่องมือโดยไม่ต้องแก้ไขกล่องเครื่องมือเอง

โดยสรุป การจัดการคอลเลกชั่นที่มีความหลากหลายนั้นเป็นการรักษาอ็อบเจ็กต์ต่างๆ ในคอลเลกชั่นราวกับว่าพวกมันอยู่ในกลุ่มเดียวกัน ในขณะที่ระบบปลั๊กอินที่มีความหลากหลายนั้นเกี่ยวข้องกับการเพิ่มคุณสมบัติพิเศษให้กับโปรแกรมด้วยวิธีที่ยืดหยุ่นและสม่ำเสมอ

บทสรุป:

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

ทรัพยากร:



https://towardsdatascience.com/polymorphism-in-python-fundamentals-for-data-scientists-9dc19071da55