The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.

บทที่ 3 การเขียนโปรแกรมเชิงวัตถุเบื้องต้น

Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by chaowalert, 2019-12-18 01:43:46

บทที่ 3 การเขียนโปรแกรมเชิงวัตถุเบื้องต้น

บทที่ 3 การเขียนโปรแกรมเชิงวัตถุเบื้องต้น

LESSON

3 การเขียนโปรแกรมเชิงวตั ถ ุ

เบ้ืองตน้

แนวคิดการเขียนโปรแกรมเชงิ วตั ถุ (Object Oriented programming)

ความแตกต่างระหวา่ งแนวคิดการเขียนโปรแกรมแบบโครงสร้าง (Procedural programing)
กบั แนวคดิ การเขยี นโปรแกรมเชงิ วตั ถุ (Object Oriented programming)

1)การเขยี นโปรแกรมแบบโครงสร้าง (Procedural programing) เปน็ การเขียนโปรแกรมดว้ ย
คาสง่ั (Statement) ให้โปรแกรมประมวลผลทลี ะคาสัง่ จากบนลงล่าง รวบรวมคาสั่งทซ่ี า ๆ กัน เพือ่ กาหนด
ขอบเขตของการทางานเป็นฟังก์ชั่น (Function) เพอื่ ใชจ้ ดั การขอ้ มลู อยา่ งงา่ ย จึงเหมาะสาหรบั โปรแกรมที่มี
การทางานเป็นขนั ตอนและไม่มคี วามซบั ซอ้ นมากนกั

2) การเขยี นโปรแกรมเชิงวตั ถุ เปน็ การเขียนโปรแกรมเพอ่ื สร้างวัตถุ (Object) เพื่อกาหนด
คุณสมบตั ิและลักษณะการทางานของวัตถุทสี่ อดคลอ้ งกบั วัตถุในชวี ติ จริง ทาให้โปรแกรมเขา้ ใจงา่ ยและ
ใกล้เคยี งกับวิธคี ดิ ของมนษุ ย์ แตก่ ารเขยี นโปรแกรมจะซบั ซอ้ นขึน

คลาส (Class) และ วตั ถุ (Object)

ในการจัดการขอ้ มูลพนื ฐาน เรารู้จักชนิดข้อมูลพืนฐานได้แก่ int, float, str ซ่งึ ไพธอนจะมองชนดิ
ขอ้ มูลเหล่านนั ในรูปแบบคลาส (Class) แตห่ ากเราตอ้ งการเก็บข้อมูลรปู แบบอนื่ ทีใ่ ช้จรงิ ในชวี ติ ประจาวัน
เชน่ ขอ้ มลู นักเรียน เราจาเป็นตอ้ งคดิ ก่อนว่าข้อมูลนกั เรยี นประกอบด้วยชนดิ ขอ้ มูลอะไรบา้ ง เชน่

ขอ้ มูลนกั เรียน(std) : เก็บข้อมูลในรปู แบบข้อความ class = ‘str’
เกบ็ ขอ้ มูลในรปู แบบข้อความ class = ‘str’
ชอ่ื นักเรียน (std_name) เก็บข้อมลู ในรปู แบบขอ้ ความ class = ‘float’
รหัสนักเรียน (std_code)
เกรดเฉลีย่ (std_gpa)

ในภาษาไพธอนสามารถใชค้ าสั่ง type(“ชอ่ื ตัวแปร”) เพ่อื ตรวจสอบชนิดขอ้ มูล ดังตวั อย่างท่ี 1.1
ตัวอยา่ งที่ 3.1 การใช้คาสง่ั type ตรวจสอบชนดิ ของขอ้ มูล

1 x = 2.5
2 y=3
3 z = "All STARS"
4 print(type(x), type(y), type(z))

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บอ้ื งตน้ 53

ผลลัพธท์ ่ไี ด้
<class 'float'> <class 'int'> <class 'str'>
Process finished with exit code 0

สงั เกตเห็นว่าการสร้างคลาส (Class) ทม่ี กี ารใช้ข้อมลู พืนฐาน คลาสยงั สามารถกาหนดชนดิ ขอ้ มูลใหม่
ขนึ มาได้ ซง่ึ ประกอบด้วยชนิดข้อมลู ต่าง ๆ ตามท่ีเราไดอ้ อกแบบไว้

วตั ถุ (Object) หมายถึงส่งิ ทถ่ี กู สรา้ งขนึ มาจากคลาส ยกตวั อยา่ งเช่น การสรา้ งบา้ น คลาส
เปรียบเสมอื นพมิ พเ์ ขยี วหรอื แบบบ้านเพอ่ื ใช้สร้างบา้ น ส่วนบ้านทส่ี ร้างจริงขึนมาเปรียบเสมือนวตั ถุนั่นเอง ดัง
ภาพที่ 3.1

ภาพที่ 3.1 ความแตกต่างระหว่างคลาส (class) กับวัตถุ (object)
ที่มาภาพ: https://goo.gl/zFhYH5

คลาสจะประกอบด้วยส่วนประกอบหลักสองสว่ นคอื
1. แอททรบิ วิ ต์ (Attribute) ใช้กาหนดคุณสมบตั ทิ วี่ ตั ถุมี เชน่ บา้ นมคี ณุ สมบัติคือ มีความกว้าง (w),

ความสงู (h), ส,ี ลกั ษณะบ้านเปน็ ต้น
2. เมธอด (Method) ใช้กาหนดสิ่งท่วี ตั ถทุ าได้ เชน่ สามารถปรบั แสงสวา่ งภายในบ้านอัตโนมตั ิ,

ปรับอุณหภูมภิ ายในบา้ นได้ เปน็ ตน้
การสร้างคลาส ชอื่ ว่า Point แทนจุดพิกดั (x, y) ซึ่งกาหนดให้มีคา่ เรม่ิ ตน้ เป็น (0, 0) โดยใช้คาส่ัง
self.x = 0 และ self.y = 0 ซ่งึ ส่วนนคี ือการกาหนดแอททริบิวต์ (Attribute) ให้กบั วตั ถุ ซึ่งในสว่ นนียงั ไม่
กล่าวถึงเมธอดของคลาส ดังตวั อยา่ งที่ 3.2

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บ้อื งตน้ 54

ตวั อยา่ งที่ 3.2 การสร้างคลาส

1 class Point:
2 def __init__(self):
3 self.x = 0
4 self.y = 0

ในเบืองตน้ ทุกคลาสจะมหี น่ึงเมธอด (Method) ชอ่ื __init__ ซง่ึ เป็นเมธอดเรมิ่ ต้น (Initializer
Method) ซ่ึงจะถูกเรียกใช้งานอัตโนมัติเมื่อเราสร้างตัวแทนของวัตถุ (Instance) ของคลาสขึนมา การทางาน
ของอินแสตนซ์ของวัตถุ (Instance) มีการกาหนดตัวแทนของวัตถุชอ่ื p ของคลาส Point ขึนมา (บรรทัดที่ 6)
แลว้ พมิ พ์คา่ x และ y (บรรทัดที่ 7) เพื่อแสดงผลดังตวั อยา่ งท่ี 3.3
ตวั อยา่ งท่ี 3.3 การสร้างคลาส

1 class Point:
2 def __init__(self):
3 self.x = 0
4 self.y = 0
5
6 p = Point() # Create object of type Point
7 print(p.x, p.y) # Each Point object has its own x and y

ผลลพั ธ์ที่ได้

00

Process finished with exit code 0

Class Diagram

Class Diagram คือ แผนภาพที่ใช้แสดง Class และความสมั พันธใ์ นแงต่ ่างๆ
(Relation) ระหว่าง Class เหลา่ นัน ซึ่งความสัมพนั ธท์ ี่กลา่ วถึงใน Class Diagram นถ่ี ือเปน็ ความสมั พันธเ์ ชิง
สถติ ย์ (Static Relationship) หมายถึงความสมั พนั ธท์ ่มี อี ยแู่ ลว้ เปน็ ปกติในระหวา่ ง Class ตา่ งๆ ไมใ่ ช่
ความสัมพนั ธท์ ่ีเกิดขนึ เนอ่ื งจากกจิ กรรมตา่ งๆ ซงึ่ เรยี กวา่ ความสัมพันธ์เชงิ กิจกรรมกจิ กรรม( Dynamic
Relationship) ส่ิงทปี่ รากฎใน Class Diagram นันประกอบดว้ ยกลมุ่ ของ Class และกลมุ่ ของ Relationship
โดยสญั ลักษณท์ ี่ใชใ้ นการแสดง Class นนั จะแทนด้วยสเ่ี หล่ยี มแบ่งออกเป็น 3 ส่วน โดยแตล่ ะส่วนนนั (จากบน
ลงล่าง) จะใชใ้ นการแสดง ชื่อของ Class, Attribute และฟงั คช์ ั่นต่างๆตามลาดับ

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บือ้ งตน้ 55

สญั ญลักษณ์ Class ประกอบด้วย

1. Class Name คอื ชอื่ ของ Class
2. Attributes คอื คุณลกั ษณะของ Class
3. Operations หรอื Methods คอื กิจกรรมท่สี ามารถกระทากับ Object นันๆได้

รูปแบบการเขยี น Class Diagram

Class Name

Attributes

Methods

ตวั อย่าง Class Diagram ในระบบธนาคาร

Customer Account

FirstName 1 M Number
LastName Balance

IDCard Transaction
PinNumber
Deposit()
Account
Withdraw()
VerifyPassword()
UpdateAccount()

การกาหนดค่าแอททรบิ วิ ต์ (Attribute) ใหก้ บั อินแสตนซข์ องวัตถุ (Instance)

การกาหนดค่าใหแ้ อททริบิวต์แทนค่าเร่ิมตน้ ทถี่ ูกกาหนดในฟงั ก์ชน่ั __init__ ได้โดยใชร้ ูปแบบ
คือ ชื่ออนิ แสตนซ์ของวัตถ.ุ ชอื่ แอทรบิ ิวต์ของคลาส = คา่ ทต่ี ้องการ เชน่ p.x = 0 คือกาหนดใหอ้ นิ แสตนซ์
ของวตั ถุ p มีคา่ แอททริบวิ ต์ x มคี ่าเท่ากบั 0 เปน็ ตน้

ในตวั อย่างท่ี 3.4 บรรทัดที่ 9 และ 10 เป็นการกาหนดค่าแอททริบวิ ตใ์ หม่เป็น x = 4 และ y = 5
โดยใชค้ าสั่ง p.x = 4 และ p.y = 5

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บอ้ื งตน้ 56

ตวั อยา่ งท่ี 3.4 การกาหนดค่าให้แอททริบิวต์

1 class Point:
2 def __init__(self):
3 self.x = 0
4 self.y = 0
5
6 p = Point() # Create object of type Point
7 print("{0} {1}".format(p.x, p.y))
8
9 p.x = 4 # modify the attribute x in object
10 p.y = 5 # modify the attribute y in object
11 print("{0} {1}".format(p.x, p.y))

ผลลพั ธท์ ี่ได้

00
45

Process finished with exit code 0

การทางานของฟงั กช์ นั่ (__init__) มีพารามเิ ตอร์ (parameter) เพยี งตวั เดยี วคือ self ดังนันเราจะ
ปรับปรุงฟงั กช์ ่ันใหม้ คี วามสมบรู ณม์ ากขึนโดยการกาหนดพารามเิ ตอรเ์ พิม่ เตมิ คอื x=0 และ y=0 ดงั ตัวอยา่ งที่
3.5 บรรทัดที่ 2
ตัวอยา่ งท่ี 3.5 การกาหนดคา่ ใหแ้ อททริบิวต์

1 class Point:
2 def __init__(self, x=0, y=0):
3 self.x = x
4 self.y = y
5 # create instance p, q, r
6 p = Point(4, 2)
7 q = Point(2, 5)
8 r = Point()
9 # print x-value of each instances
10 print("{0} {1} {2}".format(p.x, q.y, r.x))

จากตวั อย่างจะสงั เกตวา่ มีการสรา้ ง Instance p, q, r ซ่งึ มีอาร์กวิ เมนต์ (Argument) ทแ่ี ตกตา่ งกัน
ขนึ มา (บรรทดั ที่ 6-8)
ผลลพั ธท์ ไี่ ด้

450

Process finished with exit code 0

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บอื้ งตน้ 57

การเพ่ิมเมธอด (method) ให้กบั ตวั แทนของวัตถุ (Instance)

นอกจากการใช้คลาสเพือ่ กาหนดคา่ พิกัด x, y ซง่ึ เปน็ แอททริบิวตข์ องคลาส Point แล้ว ยังสามารถ
กาหนดลักษณะการทางานของ class ในรูปแบบเมธอด เชน่ เราสรา้ งเมธอดช่อื cal_dis_or เพือ่ คานวณ
ระยะหา่ งจากจดุ เป้าหมาย (Target point) กับจดุ กาเนิด (0, 0) ดงั นี
ตวั อย่างท่ี 3.6

1 class Point:
2 def __init__(self, x=0, y=0):
3 self.x = x
4 self.y = y
5
6 def cal_dis_or (self):
7 return ((self.x ** 2) + (self.y ** 2)) ** 0.5
8
9 p = Point(3, 4)
10 print("distance from origin point = {}".format(p.cal_dis_or()))

จากตวั อย่างที่ 3.6 ลาดบั การทางานของโปรแกรมคือ
1. เรยี กใชเ้ มธอด cal_dis_or ด้วยคาสัง่ p.cal_dis_or() (บรรทัดท่ี 10)
2. เมธอด cal_dis_or() จะส่งคา่ ท่ไี ด้จากการคานวณด้วยสูตร

√( . )2 + ( . )2
(บรรทดั ที่ 7) กลบั มาทจ่ี ุดท่เี รยี กใชเ้ มธอด (บรรทดั ที่ 10) เพ่ือพิมพผ์ ลลัพธ์
3. ผลลพั ธข์ องโปรแกรมคอื
distance from origin point = 5.0
Process finished with exit code 0

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บื้องตน้ 58

การส่งคา่ อาร์กิวเมนต์ (Argument) ด้วยอนิ แสตนซ์ของวัตถุ (Instance) ไปยังฟังก์ช่นั

การเข้าถึงแอททริบวิ ต์หรอื ตัวแปรภายในคลาสโดยตรง จะกระทาผ่านฟงั กช์ ัน่ นอกคลาสเพือ่ ปอ้ งกัน
การเปลย่ี นคา่ ตวั แปร ตัวอยา่ งเช่น ฟงั กช์ ่ันสาหรับพมิ พพ์ ิกดั จดุ ช่ือ print_point ดังนี
ตัวอยา่ งที่ 3.7

1 class Point:
2 def __init__(self, x=0, y=0):
3 self.x = x
4 self.y = y
5
6 def print_point(pt):
7 print("x = {0}, y = {1}".format(pt.x, pt.y))
8
9 p = Point(2, 5)
10 print_point(p)

จากตัวอย่างที่ 3.7 สังเกตว่าการสร้างฟงั กช์ น่ั ชอื่ print_point โดยรับพารามิเตอร์ด้วยอนิ แสตนซ์
ของวัตถุ ซ่ึงมีลาดบั การทางานของโปรแกรมดังนี

1. สร้างอนิ แสตนซ์ของวัตถุ p (บรรทดั ท่ี 9)
2. เรยี กใชฟ้ งั ก์ชน่ั ดว้ ยคาสง่ั print_point(p) (บรรทดั ที่ 10)
3. พารามิเตอร์ pt ของฟังกช์ ่นั print_point จะเก็บค่าอนิ แสตนซข์ องวตั ถุ p แลว้ แสดงคา่ pt.x

และ pt.y ตามลาดับ (บรรทัดที่ 7)
4. ผลลพั ธ์โปรแกรมคือ

x = 2, y = 5
Process finished with exit code 0

การสง่ คา่ กลบั (return) ของฟังก์ชัน่ ด้วยอนิ แสตนซข์ องวตั ถุ (Instance)

ฟงั ก์ช่ัน (function) และเมธอด (method) สามารถสง่ คา่ กลบั ด้วยวตั ถไุ ด้ ตวั อย่างการสร้างฟงั กช์ น่ั
ช่อื midpoint ซึ่งฟังก์ช่ันนีจะรับค่า p1 แทนพิกัดจุดแรก และ p2 แทนพิกัดจุดที่สองแล้วนามาคานวณหาจุด
กึ่งกลางระหว่างจุดสองจดุ

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บื้องตน้ 59

ตัวอยา่ งที่ 3.8

1 class Point:
2 def __init__(self, val_x=0, val_y=0):
3 self.x = val_x
4 self.y = val_y
5
6 def print_point(pt):
7 print("x = {0}, y = {1}".format(pt.x, pt.y))
8
9 def midpoint(p1, p2):
10 mx = (p1.x + p2.x)/2
11 my = (p1.y + p2.y)/2
12 return Point(mx, my)
13
14 p = Point(2, 5)
15 q = Point(4, 7)
16 r = midpoint(p, q)
17
18 print_point(p)
19 print_point(q)
20 print_point(r)

สรุปเปน็ ขันตอนการทางานของโปรแกรมดังนี
1. สรา้ งอินแสตนซ์ของวัตถุ p กาหนดพิกดั (2, 5) ในบรรทดั ที่ 14
2. สรา้ งอินแสตนซข์ องวัตถุ q กาหนดพกิ ดั (4, 7) ในบรรทดั ที่ 15
3. สรา้ งอินแสตนซ์ของวตั ถุ r เพือ่ เกบ็ ผลลพั ธข์ องฟังกช์ ั่น midpoint (บรรทดั ท่ี 16)
4. เรยี กใชง้ านฟังก์ชน่ั midpoint (บรรทดั ท่ี 16)
5. ฟงั ก์ชั่น midpoint คานวณคา่ mx และ my แลว้ สง่ ค่ากลับมายังจุดท่เี รยี กใช้งานฟงั กช์ น่ั
6. แสดงค่าอินแสตนซ์ของวัตถุ p, q, r ซง่ึ ได้ผลลพั ธด์ ังนี
x = 2, y = 5
x = 4, y = 7
x = 3.0, y = 6.0
Process finished with exit code 0

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บื้องตน้ 60

การใช้เมธอด (method) แทนรูปแบบเดมิ ทมี่ ีการใช้ฟงั กช์ นั่ เพอ่ื หาจุดกง่ึ กลางระหว่างจดุ
สองจุด (mx, my) เช่นเดียวกัน ดังตวั อย่างโปรแกรมที่ 3.9
ตัวอยา่ งที่ 3.9

1 class Point:
2 def __init__(self, x=0, y=0):
3 self.x = x
4 self.y = y
5
6 def halfway(self, target):
7 mx = (self.x + target.x) / 2
8 my = (self.y + target.y) / 2
9 return Point(mx, my)
10
11 def print_point(pt):
12 print("x = {0}, y = {1}".format(pt.x, pt.y))
13
14 p = Point(3, 4) # create instance p
15 q = Point(5, 7) # create instance q
16 r = p.halfway(q) # cal halfway point of p and q
17
18 print_point(r) # print r.x and r.y

สรปุ เปน็ ขันตอนการทางานของโปรแกรมดังนี
1. สรา้ งอินแสตนซข์ องวตั ถุ p กาหนดพกิ ัด (3, 4) ในบรรทัดท่ี 14
2. สรา้ งอินแสตนซ์ของวัตถุ q กาหนดพิกดั (5, 7) ในบรรทดั ท่ี 15
3. สร้างอนิ แสตนซข์ องวัตถุ r เพอ่ื เก็บผลลพั ธท์ ีไ่ ดจ้ ากเมธอด halfway (บรรทัดท่ี 16)
4. เรยี กใชง้ านเมธอด halfway โดยสง่ อาร์กวิ เมนต์ q ไป (บรรทดั ท่ี 16)
5. เมธอด halfway คานวณคา่ mx และ my แล้วส่งคา่ กลบั มายงั จดุ ทีเ่ รยี กใชง้ านเมธอด
6. แสดงคา่ ของวตั ถุ r ซึ่งไดผ้ ลลัพธด์ ังนี
x = 4.0, y = 5.5
Process finished with exit code 0

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บื้องตน้ 61

อภธิ านศัพท์ (Glossary)

อภิธานศัพท์ พิมพเ์ ขยี ว (template) ทใี่ ชส้ ร้างวัตถุ (Object)
class

constructor ทุกคลาสจะมีโรงงานสาหรบั ผลิตวัตถุ (Instance) ขึนมาใหมซ่ ง่ึ มีชื่อเดยี วกับคลาส
ซึ่งถ้าคลาสมเี มธอดเริม่ ตน้ (Initializer method) เมธอดนีจะใช้ในการเข้าถงึ
แอททริบิวต์ของคลาสนนั ๆ

initializer method คือเมธอดชนิดพิเศษในภาษาไพธอนช่อื วา่ __init__ ใช้สาหรับกาหนดแอททริ
บวิ ตเ์ ร่มิ ตน้ ของวตั ถขุ องคลาส

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

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บื้องตน้ 62

หลกั การสืบทอดใน python

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

Inheritance หรือการสืบทอด คอื การท่ีคลาสหรือออบเจ็ค ไดร้ ับการถ่ายทอดแอตทริบิวต์และเมธอด
จากคลาสอ่นื น่ันจะทาให้คลาสดังกล่าวมีแอตทริบวิ ตแ์ ละเมธอดเหมือนคลาสที่มันสืบทอดมาเรียกคลาสนันวา่
super class หรือ base class ส่วนคลาสท่ีได้รับการสบื ทอดเรียกวา่ sub class หรือ child class นอกจากนี
เรายังสามารถขยายความสามารถโดยการเพิ่มแอตทริบิวต์หรือเมธอด หรือทาการ override เมธอดของ
super class ได้ นี่เป็นแนวคิดในการนาโค้ดเดิมกลับมาใช้โดยไม่ต้องเขียนขึนใหม่ และเพิ่มความสามารถ
ของเดิมท่ีมีอยู่ ในภาษา Python นันยังสนับสนุน Multiple inheritance ซ่ึงอนุญาติให้คลาสสืบทอดจาก
คลาสหลายๆ คลาสได้ในเวลาเดียวกันนเ่ี ปน็ รูปแบบของการสืบทอดคลาสในภาษา Python

class DerivedClassName(BaseClassName):
pass

class DerivedClassName(BaseClassName1, BaseClassName2, …):
pass

ในตวั อยา่ ง เป็นรปู แบบการสบื ทอดคลาส โดยแบบแรกเป็นการสืบทอดจากคลาสเดยี ว ซง่ึ ชอื่ ของ
super class จะอยใู่ นวงเล็บ (BaseClassName) และสาหรบั ตัวอย่างต่อมา คือการสบื ทอดแบบหลายคลาส
โดยจะมเี ครื่องหมายคอมมา ),) แยกระหวา่ งแต่ละคลาสออกจากกนั ต่อไปมาดูตัวอย่างการสรา้ งคลาสที่สบื
ทอดจากคลาสอน่ื ในภาษา Python

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บ้ืองตน้ 63

ในการสบื ทอดคลาสนัน สามารถโดยการสร้างคลาสสาหรบั เก็บขอ้ มูลของบุคคลชื่อ Personหลังจาก
นันเราจะสร้างคลาสของลกู จา้ ง Employee ซ่ึงคลาสนจี ะสืบทอดมาจากคลาสก่อนหน้า ดงั ตัวอย่างต่อไปนี
ตวั อย่างที่ 3.10

1 class Person:
2
3 def __init__(self, firstName, lastName):
4 self.firstName = firstName
5 self.lastName = lastName
6
7 def getName(self):
8 return self.firstName + ' ' + self.lastName
9
10 class Employee(Person):
11
12 def setWorkDetail(self, department, position):
13 self.department = department
14 self.position = position
15
16 def getWorkDetail(self):
17 return self.position + ', ' + self.department
18
19 emp1 = Employee('Mladen', 'Solomun')
20 emp1.setWorkDetail('Software Engineer', 'C++ programmer')
21
22 print('Name: ' + emp1.getName())
23 print('Work: ' + emp1.getWorkDetail())
24
25 emp2 = Employee('John', 'Askew')
26 emp2.setWorkDetail('Sound Engineer', 'Musical acoustics')
27
28 print('Name: ' + emp2.getName())
29 print('Work: ' + emp2.getWorkDetail())

ผลลพั ธท์ ีไ่ ด้
Name: Mladen Solomun
Work: C++ programmer, Software Engineer
Name: John Askew
Work: Musical acoustics, Sound Engineer

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บ้อื งตน้ 64

ในตัวอย่าง เราได้สร้างคลาส Person ซ่ึงคลาสนีเป็น super class เพื่อท่ีจะนาไปให้คลาสอ่ืนสืบทอด
ในคลาสมีสองแอตทริบิวต์คือ firstName ใช้สาหรับเก็บชื่อและ lastName ใช้สาหรับเก็บนามสกุลและมี
เมธอด getName() เพ่อื รับช่อื และนามสกลุ ได้ในพรอ้ มกนั

class Employee(Person):
...

หลังจากนันเราได้สร้างคลาส Employee ซึ่งได้สืบทอดมาจากคลาส Person นั่นหมายความว่า
แอตทริบิวต์และเมธอดทังหมดจากคลาส Person จะถูกถ่ายทอดมายังคลาสนีด้วย นั่นจะทาให้มันมีทุกอย่าง
เหมือนที่คลาสหลักมี และนอกจากนีในคลาสนียังมีเมธอดและแอตทริบิวต์เพ่ิมเติมของมันเอง โดยเมธ
อด setWorkDetail() เป็นเมธอดสาหรับกาหนดรายละเอียดการทางานโดยมีตาแหน่งงานและแผนกที่สังกัด
และเมธอด getWorkDetail() แสดงข้อมลู เกย่ี วกบั การทางาน

emp1 = Employee('Mladen', 'Solomun')
emp1.setWorkDetail('Software Engineer', 'C++ programmer')

print('Name: ' + emp1.getName())
print('Work: ' + emp1.getWorkDetail())

emp2 = Employee('John', 'Askew')
emp2.setWorkDetail('Sound Engineer', 'Musical acoustics')

print('Name: ' + emp2.getName())
print('Work: ' + emp2.getWorkDetail())

Multiple Inheritance

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

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บ้ืองตน้ 65

ตัวอยา่ งท่ี 3.11 66

1 class Geographic:
2 def setCordinate(self, latitude, longitude):
3 self.latitude = latitude
4 self.longitude = longitude
5 def getCordinate(self):
6 return str(self.latitude) + ', ' + str(self.longitude)
7
8 def getTimeZone(self):
9 timezone = round(self.longitude / 12 - 1)
10 if timezone > 0:
11 return '+' + str(timezone)
12 else:
13 return str(timezone)
14 def getClimate(self):
15 if self.latitude <= -66.5 or self.latitude >= 66.5:
16 return 'Polar zone'
17 elif self.latitude <= -23.5 or self.latitude >= 23.5:
18 return 'Temperate zone'
19 else:
20 return 'Tropical zone'
21
22 class Temperature:
23 def setCelsius(self, celsius):
24 self.celsius = celsius
25 def getFahrenheit(self):
26 return self.celsius * 1.8 + 32
27 def getKelvin(self):
28 return self.celsius + 273.15
29 def getWeather(self):
30 if self.celsius <= 0:
31 return 'freezing'
32 elif self.celsius <= 18:
33 return 'cold'
34 elif self.celsius <= 28:
35 return 'warm'
36 else:
37 return 'hot'

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บ้อื งตน้

38 class Country(Geographic, Temperature):
39 def __init__(self, name, area, population):
40 self.name = name
41 self.area = area
42 self.population = population
43
44 def getPopulationDensity(self):
45 return self.population / self.area
46 def showDetails(self):
47 print('Country: %s' % self.name)
48 print('Area: %.2f sq km' % self.area)
49 print('Population: %d' % self.population)
50 print('Density: %.2f person per sq km' %
51 self.getPopulationDensity())
52 print('Decimal cordinate: %s' % self.getCordinate())
53 print('Time zone: %s' % self.getTimeZone())
54 print('Climate: %s' % self.getClimate())
55 print('Temperature in Celsius: %.2f degree' % self.celsius)
56 print('Temperature in Fahrenheit: %.2f degree' %
57 self.getFahrenheit())
58 print('Temperature in Kelvin: %.2f' % self.getKelvin())
59 print('The weather is %s' % self.getWeather())
60 print()

คลาสแรกของเราคือคลาส Geographic คลาสนีรับผิดชอบการทางานเก่ียวกับภูมิศาสตร์ โดยเรามีเมธ
อด setCordinate() สาหรับกาหนดค่า latitude และ longitude ซึ่งนี่เป็นพกิ ัดที่ตังของสิ่งต่างๆ บนโลก ในคลาส
นีเราได้มีเมธอดท่ีสาคัญคือ getTimeZone() เป็นเมธอดสาหรับหาค่า timezone จาก longitude ซึ่งลองจิจูด
หรือเส้นแวง เป็นเส้นระยะตามยาวของพืนผิวโลก มันใช้สาหรับกาหนดเขตเวลาบนโลกออกเป็นเขตต่าง ๆ
เนอ่ื งจากโลกของเราเปน็ ทรงกลม ดังนันจงึ ทาใหเ้ วลาในแต่ละพืนท่แี ตกตา่ งกนั

ต่อมาเป็นเมธอด getClimate() เมธอดนีจะนาค่า latitude เส้นละติจูดหรือที่เรียกกันว่าเส้นรุ้ง ซึ่ง
มันใช้เป็นตัวแบ่งสภาพอากาศของโลกออกเป็นสามแบบใหญ่ๆ คือเขตร้อน เขตอบอุ่น และเขตขัวโลก ดังนัน
เมธอดนจี ะบอกว่าพืนท่นี ันอยใู่ นเขตอากาศแบบไหน โดยคานวณจากค่าละตจิ ดู

ต่อมาเป็นคลาส Temperature คลาสนีจัดการเกี่ยวกับอุณหภูมิ โดยมีเมธอด setCelsius() สาหรับ
รับค่าอุณหภูมิในหน่วยองศาเซลเซียส หลังจากนันเราไดม้ ีเมธอดแปลงค่าหน่วยนีไปยังหน่วยอนื่ ๆ ในองศาฟา
เรนไฮต์ และเคลวิน และมีเมธอด getWeather() สาหรบั คานวณหาสภาพอากาศว่าร้อน อบอุน่ หนาว หรอื แช่
แขง็

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บอ้ื งตน้ 67

สาหรับในคลาส Country เป็นคลาสของประเทศที่จะเก็บรายละเอียดต่าง ๆ โดยมีแอตทริ
บิวต์ name เป็นชื่อของประเทศ area เป็นขนาดพืนที่มีหน่วยในตารางกิโลเมตร และ population เป็น
จานวนประชากรทังหมดในประเทศ และคลาสนีมีสองเมธอดคือ getPopulationDensity() เปน็ เมธอดสาหรับ
คานวณความหนาแน่นของประชากรต่อพืนที่หน่ึงตารางกิโลเมตร และเมธอด showDetails() สาหรับแสดง
รายละเอยี ดทังหมดเกีย่ วกบั ประเทศ

c = Country('Thailand', 513120, 68863514)
c.setCordinate(13.75, 100.483333)
c.setCelsius(28.5)
c.showDetails()

c2 = Country('England', 130279, 55268100)
c2.setCordinate(51.5, -0.116667)
c2.setCelsius(9)
c2.showDetails()

c2 = Country('Canada', 9984670, 35151728)
c2.setCordinate(45.4, -75.666667)
c2.setCelsius(-3)
c2.showDetails()

Method overriding

สาหรับเร่ืองสุดท้ายในบทนี จะเป็นการเรียนรู้เกี่ยวกับการ override เมธอด ซึ่งคือการที่ sub class
ทาการกาหนดการทางานให้กับเมธอดจาก super class ใหม่ โดยยังคงใช้ชื่อเดิม ซ่ึงจะทาให้เกิดคลาสใหม่ใน
บริบทของ sub class และเมธอดจาก super class จะไม่สามารถเข้าถึงได้ มาดูตัวอย่างการทางานของ
โปรแกรม
ตวั อย่างท่ี 3.12

1 class Animal:
2
3 def move(self):
4 print('Animal is moving')
5
6 class Dog(Animal):
7
8 def move(self):
9 print('Dog is running')
10
11 def parentMove(self):

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บ้อื งตน้ 68

12 print('Call parent method')
13 Animal.move(self)
14
15 a = Animal()
16 a.move()
17
18 d = Dog()
19 d.move()
20 d.parentMove()

ในตัวอย่าง เราได้สร้างคลาส Animal โดยคลาสนีมีเมธอด move() สาหรับแสดงข้อความการ
เคลื่อนท่ีของสัตว์ ต่อมาเราไดส้ ร้างคลาส Dog ซึ่งเปน็ คลาสที่สืบทอดมาจากคลาส Animal ในคลาส Dog เรา
ได้ทาการเขียนการทางานของเมธอด move() ใหม่ เพื่อบอกว่าการเคลื่อนที่ของหมานันคือการวิ่ง ดังนันการ
ทางานของเมธอดในคลาสหลักจงึ ถกู ทบั ไป

อย่างไรก็ตาม เรายังคงสามารถเรียกใช้งานเมธอดจากคลาสหลักได้ ในเมธอด parentMove() เป็น
การเรียกใช้งานเมธอดจาก super class ในคาส่ัง Animal.move(self) ในตอนนีถึงแม้ว่าเราจะได้ทาการ
override เมธอดนไี ปแล้ว แต่เราก็ยังสามารถเรียกใช้มันได้เชน่ เดมิ

Animal is moving
Dog is running
Call parent method
Animal is moving

น่ีเปน็ ผลลพั ธก์ ารทางานของโปรแกรม จะเหน็ วา่ การ override เมธอดนันเปน็ การเขยี นทบั การทางาน
เมธอดของ super class นี่มักจะใช้ในกรณีทีค่ ุณต้องการการทางานใหม่ท่ีแตกต่างจากเดิม แตย่ ังคงต้องการใช้
ช่อื เมธอดเดมิ อยู่ และไมต่ ้องการทีจ่ ะไปเปล่ียนการทางานของเมธอดใน super class

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

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บ้ืองตน้ 69

python GUI

การเขียน GUI program ด้วย python มีการเขียนได้หลายรูปแบบ แต่ในบทนีจะกล่าวถึงการ GUI
แบบง่ายๆ ด้วย python โดยการเรียกใช้ library ทช่ี ่ือวา่ tkinter ใน python 3.x มีอยแู่ ลว้ สามารถเรียกใช้ได้
ซงึ่ มีวธิ กี ารเขยี นดงั ตวั อย่างตอ่ ไปนี
ตวั อย่างที่ 3.13

1 # sample01.py : create window
2 from tkinter import *
3 # create windows
4 root = Tk()
5 # modified root windows
6 root.title("Lebeller")
7 root.geometry("400x200")
8 # kick off the event loop
9 root.mainloop()

จากโปรแกรมจะเปน็ การเรียกใช้ การทางานของหนา้ ต่าง windows ขึนมาทางานในรปู แบบ GUI

ตัวอย่างที่ 3.14

1 from tkinter import *
2 root=Tk()
3 pt="ABCD"
4 a=5
5 b=10
6 c=a+b
7 app = Frame(root)
8 app.grid()
9 root.title("Lebeller")
10 root.geometry("400x200")
11 label=Label(app,text="GOOD PCC")
12 label.grid()
13 root.mainloop()

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บื้องตน้ 70

เมอื่ รนั โปรแกรมผลลัพธ์ คือ

ถา้ มกี ารเปลย่ี นแปลคาสัง่ ในบรรทดั ท่ี 11 เป็นดังนี label=Label(app,text=pt)
ผลลพั ธท์ ไ่ี ดค้ อื อะไร

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บ้อื งตน้ 71

ใบงานประจาหน่วย

จากโปรแกรมท่ี 1 – 3 ใหน้ กั เรียนสงั เกตการทางานของโปรแกรมและนาเสนอโปรแกรมหนา้ หอ้ งและ
ใหน้ กั เรยี นศกึ ษาการทางานของโปรแกรมท่ี 4

โปรแกรมที่ 1 โปรแกรม

บรรทัด # sample03.py : add button
from tkinter import *
1 # create windows
2 root = Tk()
3 # modified root wondows
4 root.title("Lebeller")
5 root.geometry("400x200")
6 # add this to show content in GUI
7 app = Frame(root)
8 app.grid()
9 # add button
10 button1 = Button(app, text = "Button")
11 button1.grid()
12 button2 = Button(app)
13 button2.grid()
14 button2.configure(text = "show text")
15 button3 = Button(app)
16 button3.grid()
17 button3['text'] = "test"
18 # kick off the event loop
19 root.mainloop()
20
21

อธิบายการทางานของโปรแกรม

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บอ้ื งตน้ 72

โปรแกรมที่ 2
บรรทดั โปรแกรม
1 import tkinter as tk
2
3 class Application(tk.Frame):
4 def __init__(self, master=None):
5 super().__init__(master)
6 self.pack()
7 self.create_widgets()
8
9 def create_widgets(self):
10 self.hi_there = tk.Button(self)
11 self.hi_there["text"] = "Hello World\n(click me)"
12 self.hi_there["command"] = self.say_hi
13 self.hi_there.pack(side="top")
14 self.quit = tk.Button(self, text="QUIT", fg="red",command=root.destroy)
15 self.quit.pack(side="bottom")
16 def say_hi(self):
17 print("hi there, everyone!")
18 #for debug
19 if __name__=="__main__":
20 root = tk.Tk()
21 app = Application(root)
22 app.mainloop()

อธิบายการทางานของโปรแกรม

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บือ้ งตน้ 73

โปรแกรมท่ี 3 โปรแกรม

บรรทดั from tkinter import *
# create windows
1 root = Tk()
2 # modified root wondows
3 root.title("Lebeller")
4 root.geometry("400x200")
5 # add this to show content in GUI
6 app = Frame(root)
7 app.grid()
8 button1 = Button(app, text = "Button")
9 button1.grid()
10 button2 = Button(app)
11 button2.grid()
12 button2.configure(text = "show text")
13 button3 = Button(app)
14 button3.grid()
15 button3['text'] = "test"
16 # kick off the event loop
17 root.mainloop()
18
19

อธิบายการทางานของโปรแกรม

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บือ้ งตน้ 74

โปรแกรมที่ 4 การทางานประยุกต์ 75
บรรทดั โปรแกรม
1 from tkinter import *
2 from tkinter.ttk import *
3 class Application(Frame):
4 def __init__(self, master):
5 # initialize frame
6 Frame.__init__(self, master)
7 self.grid()
8 self.create_widgets()
9 def create_widgets(self):
10 #add label for number
11 self.label1 = Label(self)
12 self.label1["text"] = "Number :"
13 self.label1.grid(column=1, row=2)
14 # create combobox for select number
15 self.box = Combobox(self)
16 self.box['values'] = ('1', '2', '3', '4', '5')
17 self.box.current(0)
18 self.box.bind("<<>ComboboxSelected>")
19 self.box.grid(column=2, row=2)
20 self.button = Button(self)
21 self.button["text"] = "Print"
22 self.button["command"] = self.print_number
23 self.button.grid(column=2, row=3)
24 def print_number(self):
25 print("hi there, everyone! " + self.box.get())
26 if __name__=="__main__":
27 root = Tk()
28 root.title("Lebeller")
29 root.geometry("350x200")
30 app = Application(root)
31 root.mainloop()

เอกสารอา้ งองิ Watsan Homsin เวบ็ ไซต์ www.MarcusCode.com

lesson 3 การเขยี นโปรแกรมเชงิ วตั ถเุ บอื้ งตน้


Click to View FlipBook Version