ผลต่างระหว่างรุ่นของ "Python Programming/Inheritance"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
(สร้างหน้าใหม่: : ''ส่วนนี้ลอกมาจาก [http://garnet.cpe.ku.ac.th/~jtf/dm/?q=node/31 การโปรแกรมเชิงวัตถุใ...)
 
 
(ไม่แสดง 6 รุ่นระหว่างกลางโดยผู้ใช้ 1 คน)
แถว 3: แถว 3:
 
เราสามารถสร้างคลาส Superdog ที่สืบทอดมาจากคลาส Dog ได้ โดยเขียน
 
เราสามารถสร้างคลาส Superdog ที่สืบทอดมาจากคลาส Dog ได้ โดยเขียน
  
<pre title="interpreter editor">
+
<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