Skip to content

Python | Abstract Class และ Interface

Last updated on July 3, 2016

ภาษาโปรแกรมคอมพิวเตอร์ที่เราคุ้นเคยในปัจจุบันอาจจะมีแค่ไม่กี่ภาษา แต่ความจริงแล้วมีเป็น 100 ภาษาเลยนะครับ แต่ละภาษาถูกสร้างขึ้นให้ทำงานเฉพาะทางและเพื่อแก้ปัญหาบางอย่างเท่านั้น ภาษาไหนที่ถูกออกแบบมาให้ใช้แบบ general purpose หรือเป็นที่นิยมเราจะได้ยินชื่อบ่อยหน่อย เช่น C/C++, Java, C#, Python, Ruby, JavaScript, Go etc.

Design pattern ก็เช่นเดียวกัน คนเขียนโปรแกรมโดยทั่วไปคงคุ้นเคยกับ OOP (Object-Oriented Programming) มากหน่อยเพราะเป็นที่นิยมและมีการเรียนการสอนในสาขาที่เกี่ยวกับการเขียนโปรแกรม ภาษาที่ถูกใช้ในการเรียนการสอน OOP ก็เช่น Java, C++, C# ส่วนภาษาอื่นๆ อาจจะไม่มีฟีเจอร์แบบ OOP  เลยหรือมีแค่บางส่วน Python เองก็เหมือนกันในตอนแรกก็ใช้งานได้แค่ Class แต่ไม่มี Interface และ Abstract จนมาถึง Python >= 2.6 ถึงมี  ABC (Abstract Base Class) [Python 3.5, Python 2.7] ให้ใช้

Python นั้นเป็นภาษาที่ใช้แนวคิด Duck-typing เยอะมาก (ภาษาอื่นก็ implement เป็น Duck-typing ได้นะ) ที่เรียกอย่างนี้ก็เพราะว่า Python ไม่ได้สนใจ object เป็น  instance ของ class อะไร ขอให้มี method เหมือนกันก็เป็นอันใช้ได้ เช่น class เป็ดมี method ร้องก้าบๆ ถ้า class คนมี method ร้องก้าบๆ เหมือนกันแสดงว่าคนก็คือเป็ด (แบบนี้ก็ได้เหรอ) ดูตัวอย่างโค้ดข้างล่างนี้

class Duck:
  def quack(self):
    print("Quack!")

class Person:
  def quack(self):
    print("Quack!")

def say_something(o):
  o.quack()
  
duck = Duck()
person = Person()

say_something(duck)
say_something(person)

ถึงแม้จะมี ABC ให้ใช้แต่ก็ไม่มี interface อยู่ดี ซึ่งก็ไม่ใช่เรื่องซีเรียสอะไรเพราะสามารถใช้แทนกันได้ ตามโค้ดข้างล่างนี้ (รายละเอียดปลีกย่อยของ interface และ abstract แนะนำให้ไปดูภาษาพวก OOP จ๋าอย่าง Java, C# ครับ)

from abc import ABCMeta, abstractmethod

class Greeting(metaclass=ABCMeta):
  @abstractmethod
  def greet(self):
    raise NotImplementedError("Must implement greet() method")

class ThaiGreeting(Greeting):
  def greet(self):
    print("Sawasdee")

th_greeting = ThaiGreeting()
th_greeting.greet()

อธิบายโค้ดสักหน่อย notation @abstractmethod เหนือ function เป็นการแบบว่า function ข้างล่างนี้เป็น abstract method และถ้าไม่มีการ override greet() method ก็จะ raise NotImplementedError()

ทีนี้ก็สามารถใช้งาน Python ได้ใกล้เคียง (ขึ้นมาอีกนิดนึง) กับภาษา OOP ทั่วไปได้แล้ว

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.