Python Programming/Inheritance
- ส่วนนี้ลอกมาจาก การโปรแกรมเชิงวัตถุในไพทอน ของ จิตรทัศน์ ฝักเจริญผล
เราสามารถสร้างคลาส Superdog ที่สืบทอดมาจากคลาส Dog ได้ โดยเขียน
class Superdog(Dog):
def fly(self):
print "weeew weeeeeew", self.name, "is flying..."
def say_age(self):
print "I am not telling you"
ซึ่งสามารถเรียกใช้ได้ดังนี้
>>> a = Superdog('Mabin',1) >>> a.fly() weeew weeeeeew Mabin is flying... >>> a.say_hello() # สังเกตว่าเมท็อดนี้สืบทอดมาจากคลาส Dog Hello, my name is Mambo >>> a.say_age() # สังเกตว่าเมท็อดนี้ถูกเปลี่ยนแปลงในคลาส Superdog I am not telling you
ความเป็นพลวัต
เรานิยามคลาส Plane และคลาส Fly เพิ่มดังนี้
class Plane:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def fly(self):
print self.brand, self.model, "is flying FAST!"
class Fly:
def fly(self):
print "Time flies like an arrow"
สังเกตว่าทั้งสามคลาสที่เราได้นิยามมา คือ Superdog, Plane และ Fly มีเมท็อด fly เหมือนกันทั้งสิ้น เราสามารถนำวัตถุของคลาสทั้งสามมาใช้ได้ในทุกที่ที่เราต้องการเรียกใช้เมท็อด fly เช่นในตัวอย่างด้านล่างนี้
>>> o1 = Superdog('Johny',3) >>> o2 = Plane('AirSuperJet','T1000') >>> o3 = Fly() >>> >>> objs = [o1,o2,o3] >>> for o in objs: ... o.fly() ... weeew weeeeeew Johny is flying... AirSuperJet T1000 is flying FAST! Time flies like an arrow
เราอาจะเขียนฟังก์ชัน flyflyfly ดังด้านล่าง
def flyflyfly(x):
print "Preparing..."
x.fly()
x.fly()
x.fly()
ในเมท็อดนี้เราไม่จำเป็นต้อง ระบุล่วงหน้า ว่าอาร์กิวเมนต์ x จะต้องเป็นวัตถุประเภทอะไร โดยเราสามารถส่งวัตถุประเภทใดก็ได้ ขอเพียงแต่ให้มีเมท็อด fly ตามต้องการเท่านั้น เช่น เมื่อเราสั่ง flyflyfly(o2) ผลลัพธ์ที่ได้คือ
Preparing... AirSuperJet T1000 is flying FAST! AirSuperJet T1000 is flying FAST! AirSuperJet T1000 is flying FAST!
ถ้าวัตถุที่ส่งให้ฟังก์ชันดังกล่าวไม่มีเมท็อด fly จะเกิดข้อผิดพลาดขึ้นเมื่อทำงาน
>>> flyflyfly(d) Preparing... Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in flyflyfly AttributeError: Dog instance has no attribute 'fly'
สังเกตว่าข้อผิดพลาดเกิดขึ้นเมื่อมีการเรียกเมท็อด fly (การสั่งพิมพ์ Preparing... ยังทำงานได้)
ลักษณะดังกล่าวเป็นข้อแตกต่างข้อหนึ่งของภาษาในกลุ่มภาษาเชิงพลวัติ (dynamic languages) เช่น Python หรือ Ruby กับภาษาเชิงสถิตย์ (static languages) เช่น Java, C++ หรือ C# นั่นคือโดยทั่วไปแล้วในภาษาเชิงพลวัตินั้น ชนิดของข้อมูลต่าง ๆ จะไม่มีการวิเคราะห์หรือตรวจสอบไว้ล่วงหน้า (ระหว่างคอมไพล์) แต่จะตรวจสอบเมื่อใช้งานจริง (เรียกว่าทำในขณะ run time) ลักษณะดังกล่าวมีข้อดีที่ทำให้เราเขียนโปรแกรมได้อย่างมีความสะดวกมากขึ้น อย่างไรก็ตามเนื่องจากไม่มีการตรวจสอบล่วงหน้า ถ้าโปรแกรมของเรามีข้อผิดพลาดด้านชนิดข้อมูลแบบง่าย ๆ เราก็จะไปพบเมื่อตอนโปรแกรมทำงาน แทนที่จะพบก่อนเมื่อตอนคอมไพล์
หน้าก่อน: Classes | สารบัญ | หน้าต่อไป: Modules |