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

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 4 รุ่นระหว่างกลางโดยผู้ใช้ 1 คน)
แถว 1: แถว 1:
: ส่วนนี้ลอกมาจาก [http://garnet.cpe.ku.ac.th/~jtf/dm/?q=node/31 การโปรแกรมเชิงวัตถุในไพทอน] ของ [http://www.cpe.ku.ac.th/~jtf/ จิตรทัศน์ ฝักเจริญผล]
+
: ''ส่วนนี้ลอกมาจาก [http://garnet.cpe.ku.ac.th/~jtf/dm/?q=node/31 การโปรแกรมเชิงวัตถุในไพทอน] ของ [http://www.cpe.ku.ac.th/~jtf/ จิตรทัศน์ ฝักเจริญผล]''
  
 
ภาษา Python รองรับการโปรแกรมเชิงวัตถุในรูปแบบที่ค่อนข้างจำกัด ยกตัวอย่างเช่น ภาษาไม่มีกระบวนการจัดการซ่อนข้อมูลที่สมบูรณ์นัก อย่างไรก็ตามเนื่องจากภาษา Python เป็นภาษาเชิงพลวัติทำให้เราได้ความคล่องตัวหลาย ๆ อย่างกลับมาแทน ในส่วนนี้เราจะได้ศึกษาเกี่ยวกับเรื่องดังกล่าว
 
ภาษา Python รองรับการโปรแกรมเชิงวัตถุในรูปแบบที่ค่อนข้างจำกัด ยกตัวอย่างเช่น ภาษาไม่มีกระบวนการจัดการซ่อนข้อมูลที่สมบูรณ์นัก อย่างไรก็ตามเนื่องจากภาษา Python เป็นภาษาเชิงพลวัติทำให้เราได้ความคล่องตัวหลาย ๆ อย่างกลับมาแทน ในส่วนนี้เราจะได้ศึกษาเกี่ยวกับเรื่องดังกล่าว
  
== คลาส ==
 
 
เราสามารถประกาศคลาส Dog พร้อมด้วยเมท็อด bark ได้ดังนี้
 
เราสามารถประกาศคลาส Dog พร้อมด้วยเมท็อด bark ได้ดังนี้
  
<pre title="interpreter">
+
<syntaxhighlight lang="python">
>>> class Dog:
+
class Dog:
...     def bark(self):
+
     def bark(self):
...         print "Box box"
+
         print "Box box"
</pre>
+
</syntaxhighlight>
  
 
เราสร้าง object ของคลาส Dog โดยเรียก
 
เราสร้าง object ของคลาส Dog โดยเรียก
แถว 46: แถว 45:
 
ดังนั้นเราสามารถอ้างถึงคุณลักษณะของวัตถุผ่านทางอาร์กิวเมนท์นี้ ยกตัวอย่างเช่น เราสามารถเขียนเมท็อด say_age ซึ่งพิมพ์อายุของวัตถุคลาส Dog ได้เป็น
 
ดังนั้นเราสามารถอ้างถึงคุณลักษณะของวัตถุผ่านทางอาร์กิวเมนท์นี้ ยกตัวอย่างเช่น เราสามารถเขียนเมท็อด say_age ซึ่งพิมพ์อายุของวัตถุคลาส Dog ได้เป็น
  
<pre title="python">
+
<syntaxhighlight lang="python">
 +
def say_hello(self):
 +
    print 'Hello, I am', self.age, 'years old.'
 +
</syntaxhighlight>
 +
 
 +
อย่างไรก็ตาม ถ้าวัตถุนั้นไม่มีคุณลักษณะ age เมท็อดดังกล่าวจะสร้างความผิดพลาดเมื่อทำงาน เราสามารถกำหนดให้มีการระบุค่าเริ่มต้นของวัตถุในคลาสได้เมื่อสร้างวัตถุ ขึ้น โดยเขียนเมท็อด __init__ พิจารณาตัวอย่างคลาส Dog ที่สมบูรณ์ขึ้นด้านล่างนี้
 +
 
 +
<syntaxhighlight lang="python">
 +
class Dog:
 +
    def __init__(self,name,age):
 +
        self.name = name
 +
        self.age = age
 
     def say_hello(self):
 
     def say_hello(self):
         print 'Hello, I am', self.age, 'years old.'
+
         print 'Hello, my name is', self.name
 +
    def say_age(self):
 +
        print 'I am', self.age, 'years old'
 +
</syntaxhighlight>
 +
 
 +
ตัวอย่างการใช้งานเช่น
 +
 
 +
<pre title="interpreter">
 +
>>> d = Dog('dang',3)
 +
>>> d.say_hello()
 +
Hello, my name is dang
 +
>>> e = Dog('dum',4)
 +
>>> e.say_age()
 +
I am 4 years old
 
</pre>
 
</pre>
  
อย่างไรก็ตาม ถ้าวัตถุนั้นไม่มีคุณลักษณะ age เมท็อดดังกล่าวจะสร้างความผิดพลาดเมื่อทำงาน เราสามารถกำหนดให้มีการระบุค่าเริ่มต้นของวัตถุในคลาสได้เมื่อสร้างวัตถุ ขึ้น โดยเขียนเมท็อด __init__ พิจารณาตัวอย่างคลาส Dog ที่สมบูรณ์ขึ้นด้านล่างนี้
+
ในการเรียกเมท็อด เรายังสามารถเรียกในลักษณะนี้ได้ด้วย (เรียกเมท็อดโดยตรงจากคลาส และผ่านค่า self ให้อย่างชัดเจน)
  
<pre title="interpreter">
+
<pre title="interpreter>
>>> class Dog:
+
>>> Dog.say_hello(d)
...    def __init__(self,name,age):
+
Hello, my name is dang
...        self.name = name
 
...        self.age = age
 
...    def say_hello(self):
 
...        print 'Hello, my name is', self.name
 
...    def say_age(self):
 
...        print 'I am', self.age, 'years old'
 
 
</pre>
 
</pre>
 +
 +
การตั้งชื่ออาร์กิวเมนต์แรกของเมท็อดที่อ้างถึงวัตถุโดยธรรมเนียมแล้วนิยมตั้งว่า self อย่างไรก็ตาม เราสามารถใช้ชื่ออะไรก็ได้ อาร์กิวเมนต์ดังกล่าวจะอ้างไปถึงวัตถุที่เรียกเมท็อดนั้นเช่นเดียวกัน
 +
 +
{{Python Programming/Navigation|Objects|Inheritance}}

รุ่นแก้ไขปัจจุบันเมื่อ 04:18, 4 ตุลาคม 2558

ส่วนนี้ลอกมาจาก การโปรแกรมเชิงวัตถุในไพทอน ของ จิตรทัศน์ ฝักเจริญผล

ภาษา Python รองรับการโปรแกรมเชิงวัตถุในรูปแบบที่ค่อนข้างจำกัด ยกตัวอย่างเช่น ภาษาไม่มีกระบวนการจัดการซ่อนข้อมูลที่สมบูรณ์นัก อย่างไรก็ตามเนื่องจากภาษา Python เป็นภาษาเชิงพลวัติทำให้เราได้ความคล่องตัวหลาย ๆ อย่างกลับมาแทน ในส่วนนี้เราจะได้ศึกษาเกี่ยวกับเรื่องดังกล่าว

เราสามารถประกาศคลาส Dog พร้อมด้วยเมท็อด bark ได้ดังนี้

class Dog:
    def bark(self):
        print "Box box"

เราสร้าง object ของคลาส Dog โดยเรียก

>>> dang = Dog()

เมื่อเราสั่ง dang.bark() เราจะเห็นสตริง Box box ถูกพิมพ์ออกมา

>>> dang.bark()
Box box

วัตถุของเราสามารถมีคุณลักษณะ (attribute) ได้ โดย attribute ในภาษาไพทอนจะมีลักษณะคล้าย public field ของภาษา C หรือ Java เราสามารถสั่ง

>>> dang.age = 100

เพื่อกำหนดค่าให้กับคุณลักษณะ age ของวัตถุ dang ได้

สังเกตว่าเรา ไม่จำเป็น ต้องประกาศไว้ล่วงหน้าว่าวัตถุของคลาส Dog จะมีคุณลักษณะใดบ้าง อย่างไรก็ตามถ้าเราเรียกใช้คุณสมบัติที่ไม่เคยประกาศมาก่อนจะเกิดข้อผิดพลาดขึ้น เช่น

>>> dang.speed
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Dog instance has no attribute 'speed'

สังเกตเมท็อด bark ในเมท็อดดังกล่าวมีการระบุอาร์กิวเมนต์ self ที่ไม่ได้เรียกใช้เอาไว้ อาร์กิวเมนต์ดังกล่าวจะอ้างถึงวัตถุที่เรียกใช้เมท็อดดังกล่าวอยู่ ยกตัวอย่างเช่น เมื่อเราสั่ง d.bark() อาร์กิวเมนต์ self จะอ้างไปยังวัตถุ d ให้อัตโนมัติ

ดังนั้นเราสามารถอ้างถึงคุณลักษณะของวัตถุผ่านทางอาร์กิวเมนท์นี้ ยกตัวอย่างเช่น เราสามารถเขียนเมท็อด say_age ซึ่งพิมพ์อายุของวัตถุคลาส Dog ได้เป็น

def say_hello(self):
    print 'Hello, I am', self.age, 'years old.'

อย่างไรก็ตาม ถ้าวัตถุนั้นไม่มีคุณลักษณะ age เมท็อดดังกล่าวจะสร้างความผิดพลาดเมื่อทำงาน เราสามารถกำหนดให้มีการระบุค่าเริ่มต้นของวัตถุในคลาสได้เมื่อสร้างวัตถุ ขึ้น โดยเขียนเมท็อด __init__ พิจารณาตัวอย่างคลาส Dog ที่สมบูรณ์ขึ้นด้านล่างนี้

class Dog:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def say_hello(self):
        print 'Hello, my name is', self.name
    def say_age(self):
        print 'I am', self.age, 'years old'

ตัวอย่างการใช้งานเช่น

>>> d = Dog('dang',3)
>>> d.say_hello()
Hello, my name is dang
>>> e = Dog('dum',4)
>>> e.say_age()
I am 4 years old

ในการเรียกเมท็อด เรายังสามารถเรียกในลักษณะนี้ได้ด้วย (เรียกเมท็อดโดยตรงจากคลาส และผ่านค่า self ให้อย่างชัดเจน)

>>> Dog.say_hello(d)
Hello, my name is dang

การตั้งชื่ออาร์กิวเมนต์แรกของเมท็อดที่อ้างถึงวัตถุโดยธรรมเนียมแล้วนิยมตั้งว่า self อย่างไรก็ตาม เราสามารถใช้ชื่ออะไรก็ได้ อาร์กิวเมนต์ดังกล่าวจะอ้างไปถึงวัตถุที่เรียกเมท็อดนั้นเช่นเดียวกัน

หน้าก่อน: Objects สารบัญ หน้าต่อไป: Inheritance