ผลต่างระหว่างรุ่นของ "Python Programming/Inheritance"
Cardcaptor (คุย | มีส่วนร่วม) |
Cardcaptor (คุย | มีส่วนร่วม) |
||
แถว 65: | แถว 65: | ||
... | ... | ||
</pre> | </pre> | ||
+ | |||
+ | ในเมท็อดนี้เราไม่จำเป็นต้อง '''ระบุล่วงหน้า''' ว่าอาร์กิวเมนต์ x จะต้องเป็นวัตถุประเภทอะไร โดยเราสามารถส่งวัตถุประเภทใดก็ได้ ขอเพียงแต่ให้มีเมท็อด fly ตามต้องการเท่านั้น เช่น เมื่อเราสั่ง flyflyfly(o2) ผลลัพธ์ที่ได้คือ | ||
+ | |||
+ | <pre title="interpreter"> | ||
+ | Preparing... | ||
+ | AirSuperJet T1000 is flying FAST! | ||
+ | AirSuperJet T1000 is flying FAST! | ||
+ | AirSuperJet T1000 is flying FAST! | ||
+ | </pre> | ||
+ | |||
+ | ถ้าวัตถุที่ส่งให้ฟังก์ชันดังกล่าวไม่มีเมท็อด fly จะเกิดข้อผิดพลาดขึ้นเมื่อทำงาน | ||
+ | |||
+ | <pre title="interpreter"> | ||
+ | >>> 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' | ||
+ | </pre> | ||
+ | |||
+ | สังเกตว่าข้อผิดพลาดเกิดขึ้นเมื่อมีการเรียกเมท็อด fly (การสั่งพิมพ์ Preparing... ยังทำงานได้) | ||
+ | |||
+ | ลักษณะดังกล่าวเป็นข้อแตกต่างข้อหนึ่งของภาษาในกลุ่มภาษาเชิงพลวัติ (dynamic languages) เช่น Python หรือ Ruby กับภาษาเชิงสถิตย์ (static languages) เช่น Java, C++ หรือ C# นั่นคือโดยทั่วไปแล้วในภาษาเชิงพลวัตินั้น ชนิดของข้อมูลต่าง ๆ จะไม่มีการวิเคราะห์หรือตรวจสอบไว้ล่วงหน้า (ระหว่างคอมไพล์) แต่จะตรวจสอบเมื่อใช้งานจริง (เรียกว่าทำในขณะ run time) ลักษณะดังกล่าวมีข้อดีที่ทำให้เราเขียนโปรแกรมได้อย่างมีความสะดวกมากขึ้น อย่างไรก็ตามเนื่องจากไม่มีการตรวจสอบล่วงหน้า ถ้าโปรแกรมของเรามีข้อผิดพลาดด้านชนิดข้อมูลแบบง่าย ๆ เราก็จะไปพบเมื่อตอนโปรแกรมทำงาน แทนที่จะพบก่อนเมื่อตอนคอมไพล์ |
รุ่นแก้ไขเมื่อ 18:43, 19 ตุลาคม 2551
- ส่วนนี้ลอกมาจาก การโปรแกรมเชิงวัตถุในไพทอน ของ จิตรทัศน์ ฝักเจริญผล
เราสามารถสร้างคลาส 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) ลักษณะดังกล่าวมีข้อดีที่ทำให้เราเขียนโปรแกรมได้อย่างมีความสะดวกมากขึ้น อย่างไรก็ตามเนื่องจากไม่มีการตรวจสอบล่วงหน้า ถ้าโปรแกรมของเรามีข้อผิดพลาดด้านชนิดข้อมูลแบบง่าย ๆ เราก็จะไปพบเมื่อตอนโปรแกรมทำงาน แทนที่จะพบก่อนเมื่อตอนคอมไพล์