ผลต่างระหว่างรุ่นของ "Python Programming/Inheritance"
Cardcaptor (คุย | มีส่วนร่วม) (สร้างหน้าใหม่: : ''ส่วนนี้ลอกมาจาก [http://garnet.cpe.ku.ac.th/~jtf/dm/?q=node/31 การโปรแกรมเชิงวัตถุใ...) |
Chaiporn (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 6 รุ่นระหว่างกลางโดยผู้ใช้ 1 คน) | |||
แถว 3: | แถว 3: | ||
เราสามารถสร้างคลาส Superdog ที่สืบทอดมาจากคลาส Dog ได้ โดยเขียน | เราสามารถสร้างคลาส Superdog ที่สืบทอดมาจากคลาส Dog ได้ โดยเขียน | ||
− | < | + | <syntaxhighlight lang="python"> |
class Superdog(Dog): | class Superdog(Dog): | ||
def fly(self): | def fly(self): | ||
print "weeew weeeeeew", self.name, "is flying..." | print "weeew weeeeeew", self.name, "is flying..." | ||
− | |||
def say_age(self): | def say_age(self): | ||
print "I am not telling you" | print "I am not telling you" | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ซึ่งสามารถเรียกใช้ได้ดังนี้ | ||
+ | |||
+ | <pre title="interpreter"> | ||
+ | >>> 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 | ||
</pre> | </pre> | ||
+ | |||
+ | == ความเป็นพลวัต == | ||
+ | เรานิยามคลาส Plane และคลาส Fly เพิ่มดังนี้ | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | 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" | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | สังเกตว่าทั้งสามคลาสที่เราได้นิยามมา คือ Superdog, Plane และ Fly มีเมท็อด fly เหมือนกันทั้งสิ้น เราสามารถนำวัตถุของคลาสทั้งสามมาใช้ได้ในทุกที่ที่เราต้องการเรียกใช้เมท็อด fly เช่นในตัวอย่างด้านล่างนี้ | ||
+ | |||
+ | <pre title="interpreter"> | ||
+ | >>> 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 | ||
+ | </pre> | ||
+ | |||
+ | เราอาจะเขียนฟังก์ชัน flyflyfly ดังด้านล่าง | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | def flyflyfly(x): | ||
+ | print "Preparing..." | ||
+ | x.fly() | ||
+ | x.fly() | ||
+ | x.fly() | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ในเมท็อดนี้เราไม่จำเป็นต้อง '''ระบุล่วงหน้า''' ว่าอาร์กิวเมนต์ 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) ลักษณะดังกล่าวมีข้อดีที่ทำให้เราเขียนโปรแกรมได้อย่างมีความสะดวกมากขึ้น อย่างไรก็ตามเนื่องจากไม่มีการตรวจสอบล่วงหน้า ถ้าโปรแกรมของเรามีข้อผิดพลาดด้านชนิดข้อมูลแบบง่าย ๆ เราก็จะไปพบเมื่อตอนโปรแกรมทำงาน แทนที่จะพบก่อนเมื่อตอนคอมไพล์ | ||
+ | |||
+ | {{Python Programming/Navigation|Classes|Modules}} |
รุ่นแก้ไขปัจจุบันเมื่อ 04:20, 4 ตุลาคม 2558
- ส่วนนี้ลอกมาจาก การโปรแกรมเชิงวัตถุในไพทอน ของ จิตรทัศน์ ฝักเจริญผล
เราสามารถสร้างคลาส 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 |