อย่างไรก็ตามคลาสในไพธอนไม่ตรงตามหลักการของ OOP มากนัก ดังนั้นไพธอนอาจเหมาะเป็นภาษาแรก แต่ไม่เหมาะสำหรับการสอน OOP แน่ๆ
กลับมาดูคลาสในไพธอนดีกว่า เริ่มจากคลาสง่ายๆ
class Person: pass
ตัวอย่างข้างบนเป็นคลาสที่พื้นฐานที่สุด ขณะเดียวกันก็สามารถนำไปประยุกต์ใช้งานได้มากมาย ก่อนอื่นต้องสร้างอ๊อบเจ็กขึ้นมาก่อน
p = Person()
แค่นี้ก็เอา p ไปใช้ได้แล้ว ซึ่งตอนนี้มีสภาพเหมือนกล่องเปล่า อยากใส่อะไรก็ได้
p.name = 'Alice' p.age = 8 print p.name,p.age
อย่างไรก็ตามการใช้งานแบบข้างบนจะมีข้อเสียนิดหน่อย ตรงที่อ๊อบเจ็กอื่นของคลาส Person จะไม่มี name และ age ซึ่งแก้ไขได้โดยการกำหนดค่าเริ่มต้น
class Person: name = 'noname' age = 0
ซึ่งจะรับประกันได้ว่า Person ทุกอ็อบเจ็กจะมี name และ age เสมอ แต่ยังไม่สามารถกำหนดค่าเริ่มต้นแบบสวยๆ ได้
class Person: def __init__(self,name,age): self.name = name self.age = age
วิธีกำหนดค่าเริ่มต้นจะต้องใช้ constructor เข้ามาช่วย ในไพธอนนั้นจะเป็นเมธอดชื่อ __init__ นั่นเอง ทุกเมธอดในคลาสของไพธอนจะใช้พารามิเตอร์ตัวแรกแทนตัวเอง ซึ่งปกติจะใช้ชื่อself สำหรับคนที่ชินกับภาษาซี หรือจาวา self ก็คือ this นี่เอง วิธีแบบนี้ทำให้การเขียนโปรแกรมเข้าใจง่ายขึ้นมาก เพราะไม่ต้องงงว่า this คืออะไร มีที่มาอย่างไร เวลาใช้จึงเปลี่ยนไปเล็กน้อย
p = Person('Alice',8)
ถ้าอยากใส่เมธอดเพิ่มเติมก็ใส่เข้าไปในคลาสได้
class Person: def __init__(self,name,age): self.name = name self.age = age def show(self): print '%s is %d years old.' % (self.name,self.age) p = Person('Alice',8) p.show()
หรือถ้าจะให้ดูเป็นไพธอนมากกว่านี้ก็ต้องแก้ constructor นิดนึง
class Person: def __init__(self,**kw): self.name = kw.get('name','noname') self.age = kw.get('age',0) def show(self): print '%s is %d years old.' % (self.name,self.age) p = Person(name='Alice',age=8) p.show()
หรือจะเป็นแบบข้างล่างก็ได้
class Person: name = 'noname' age = 0 def __init__(self,**kw): self.__dict__.update(kw) def show(self): print '%s is %d years old.' % (self.name,self.age) p = Person(name='Alice',age=8) p.show()
