คลาสและออบเจ็ค (Object Oriented Programming (OOP) in Python)
Contents
คลาสและออบเจ็ค (Object Oriented Programming (OOP) in Python)#
40 minutes
วัตถุประสงค์
หลังจากทำทำแล็บ นศ.จะสามารถ
ใช้งานคลาสและออบเจ็กต์ได้
กำหนดแอตทริบิวต์และเมธอดของคลาสได้
Import Matplotlib และ Requests เพื่อพล็อตกราฟและดึงข้อมูลจากหน้าเว็บไซต์อย่างง่ายได้
Ref:
คลาสและออบเจ็กต์ (Classes☀︎ & Objects☀︎)#
การเขียนโปรแกรมเชิงวัตถุ (OOP) * เป็นเรื่องที่สำคัญมากๆ เป็นแนวคิดที่ใช้กันอย่างแพร่หลายในการเขียนโปรแกรมภาษาสมัยใหม่เกือบทั้งหมด (ยกเว้นภาษา C) ข้อดีของการเขียนโปรแกรมแบบ OOP คือ ช่วยให้ผู้เขียนโปรแกรมสามารถเปลี่ยนแปลงแก้ไขโค้ดที่เขียนมาแล้วได้อย่างง่ายๆ และโค้ดที่เขียนขึ้นมายังสามารถนำไปใช้ในโปรแกรมที่เขียนขึ้นใหม่ได้ โดยอาจแก้ไขเพียงเล็กน้อยหรือไม่แก้ไขเลย (Reusable) จึงทำให้ OOP เหมาะกับเขียนโปรแกรมขนาดใหญ่และยังช่วยให้โปรแกรมเมอร์ทำงานร่วมกันได้อย่างมีประสิทธิภาพ
* วิธีการเขียนโปรแกรมเชิงวัตถุ (OOP) ถูกคิดค้นในปี 1967 โดย Dr. Kristen Nygaard ชาวนอร์เวย์ (ภาษา Simula-67) ปัจจุบันหลายภาษารองรับ OOP เช่น JAVA และ Ruby เป็น OOP 100%, Python รองรับการเขียนโปรแกรมทั้งแบบเชิงฟังก์ชันและแบบ OOP, Fortran และ MATLAB เป็นแบบเชิงฟังก์ชันเป็นหลัก บางส่วนเพิ่งแก้ไขเป็น OOP, C เป็นภาษาแบบเชิงฟังก์ชัน 100% ส่วน C++ เป็น C ที่เพิ่ม OOP เข้าไป.
ภาษา Python รองรับทั้งการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming (OOP)) และเชิงฟังก์ชัน (Functional programming หรือ Structure/Procedure Programming) เพื่อให้นักพัฒนามีทางเลือกในการทำงานในสภาพแวดล้อมที่แตกต่างกัน
OOP เป็นวิธีการเขียนโปรแกรมโดยมองสิ่งต่างๆ ในระบบเป็นวัตถุหรือออบเจ็กต์ (Object หรือ Instance of class) แต่ละวัตถุจะมีความเป็นเอกเทศหรือมีความสมบูรณ์ในตัวเอง กล่าวคือมีทั้ง ข้อมูล (Data) ที่แสดงคุณลักษณะของวัตถุ (Attributes (Variables)) และ เมทธอด (Methods (Functions))☀︎ ที่ใช้ในการเข้าถึงและจัดการกับตัวข้อมูลของวัตถุ (จากนี้ไปจะเรียกทับศัพท์ว่า ออบเจ็กต์ ) การเขียนโปรแกรมโดยใช้ออบเจ็กต์ทำให้การแลกเปลี่ยนข้อมูลและการติดต่อสื่อสารระหว่างกันทำได้ง่าย และสิ่งที่สำคัญที่สุดคือ ออบเจ็กที่สร้างขึ้นมาแล้วสามารถนำโค้ดของโปรแกรมกลับมาใช้ใหม่ได้อีก (Reusable)
ในภาษาคอมฯ ก่อนจะสร้างอออบเจ็กต์ขึ้นมาใช้ จำเป็นต้องมีการออกแบบออบเจ็กต์ขึ้นมาก่อน เหมือนกับการสร้างบ้าน ก่อนจะสร้างบ้านสถาปนิกต้องทำการออกแบบโครงสร้างของบ้านลงกระดาษพิมพ์เขียว (Blueprint) หลังจากนั้นวิศวกรจึงนำกระดาษพิมพ์เขียวไปสร้างบ้าน กระดาษพิมพ์เขียวเพียงแผ่นเดียว สามารถนำไปสร้างบ้านได้หลายๆ หลัง ในมุมมองของการเขียนโปรแกรมแบบ OOP กระดาษพิมพ์เขียวก็คือ คลาส (Class) และบ้านที่ถูกสร้างขึ้นก็คือ ออบเจ็กต์ (Object)
ปูพื้นก่อนสร้างคลาส#
ในขั้นตอนแรก เราจะสร้างคลาส (Class) ขึ้นมา 2 คลาส คือ
คลาสวงกลม (Circle) และ
คลาสสี่เหลี่ยมผืนผ้า (Regtangle)
ในการสร้างคลาส เราต้องกำหนดข้อมูลทั้งหมดที่ประกอบขึ้นเป็นคลาส ซึ่งเราเรียกข้อมูลที่เป็นส่วนประกอบของคลาสนี้ว่า คุณลักษณะหรือแอตทริบิวต์ (Attributes (Variables))☀︎ ของวัตถุ
เราจะใช้กระดาษพิมพ์เขียวสร้างออบเจ็กต์วงกลมและสี่เหลี่ยมผืนผ้า (รูปด้านล่าง)
ในกระดาษพิมพ์เขียวมี 2 คลาส คือ คลาสวงกลมและคลาสสี่เหลี่ยมผืนผ้า แต่ละคลาสจะมีแอตทริบิวต์หรือมีคุณลักษณะเฉพาะตัวของมันเอง คลาสวงกลม Class Circle
มีแอตทริบิวต์ radius
และ color
ส่วนคลาสสี่เหลี่ยมผืนผ้า Class Regtangle
มีแอตทริบิวต์ height
,width
และ color
☀︎คำศัพท์ที่เกี่ยวข้อง
คลาส (Class) คือ ประเภทข้อมูลที่กำหนดขึ้นโดยผู้ใช้ (User-defined type) เป็นเสมือนกระดาษพิมพ์เขียว (ต้นแบบ) ที่ใช้ในสร้างออบเจ็คต์ หรือกล่าวอีกนัยหนึ่งก็คือ คลาสคือประเภทข้อมูล (type) ของออบเจ็คต์นั่นเอง
ออบเจ็คต์ (Object หรือ Instance) คือ สิ่งที่ใช้งานได้จริงๆ ถูกสร้างขึ้นมาจากคลาส
แอตทริบิวต์ (Attributes/Instance attributes) คือ ข้อมูล (หรือคุณลักษณะ) ที่เป็นสมาชิก (หรือเป็นส่วนประกอบ) ของแต่ละออบเจ็คต์ โดยมักจะกำหนดไว้ในเมธอด
_init_
ของคลาส (Object Content: Data and Attributes)เมธอด (Method) คือ ฟังก์ชันการทำงานหรือจัดการข้อมูลที่กำหนดไว้ในคลาส (Methods are functions that are bundled with objects.)
☀︎คำศัพท์ที่เกี่ยวข้อง (Supplement)
คลาสแอตทริบิวต์ (class attributes) คือ ตัวแปรที่ประกาศไว้ภายในคลาส ซึ่งจะแชร์ข้อมูลกับออบเจ็คทุกตัวที่ถูกสร้างขึ้นจากคลาสนั้นๆ โดยจะกำหนดไว้ภายนอกเมธอด
_init_
ของคลาส
ออบเจ็คต์ & แอตทริบิวต์ (Objects and Attributes)#
คลาสจะประกอบไปด้วยสมาชิกสองประเภท คือ แอตทริบิวต์หรือคุณลักษณะ (ซึ่งก็คือตัวแปรของคลาส) ใช้ในการเก็บข้อมูลที่ประกอบขึ้นเป็นคลาสนั้นๆ และ เมธอด (methods) เป็นฟังก์ชันการทำงานหรือจัดการข้อมูลภายในคลาสนั้นๆ
ออบเจ็กต์เป็นตัวแทนของคลาสที่ใช้งานได้จริงๆ (ต่างกับคลาสที่เป็นเพรียงต้นแบบ)
ในรูปด้านล่างเป็นรูปของวงกลม 3 วงที่สร้างขึ้นจากคลาสวงกลม แต่ละวงมีชื่อเรียก ‘Red circle’, ‘Yellow circle’, และ ‘Green circle’ โดยทั้ง 3 มีลักษณะเดียวกันคือเป็นวงกลม แต่มีข้อมูลประจำตัวหรือคุณลักษณะ (แอตทริบิวต์) radius
และ color
ที่แตกต่างกัน
แอตทริบิวต์เป็นตัวแปรของคลาส ณ ที่นี้คือ radius
และ color
ซึ่งเป็นข้อมูลสาธารณะสามารถเข้าถึงข้อมูลได้จากภายนอกคลาสได้
ข้อมูลของออบเจ็กต์สามารถเข้าถึงได้ด้วยการเขียนเครื่องหมายจุด (.) ต่อท้ายชื่อของออบเจ็กต์ (เป็นการบอกว่าเป็นข้อมูลของออบเจ็กต์นั้นๆ) ซึ่งจะกล่าวถึงต่อไป
(รูป) ข้อมูลประจำตัวหรือแอตทริบิวต์ที่ต่างกัน เช่น สี (Red , Yellow และ Green )
ออบเจ็คต์ & เมธอด (Objects and Method)#
เมธอด (Method) คือฟังก์ชันการทำงานหรือจัดการข้อมูลในคลาส (เมธอดนั้นคล้ายกับฟังก์ชัน (Functions) แต่ในบริบทของการเขียนโปรแกรมเชิงวัตถุแล้วเราจะเรียกว่า “เมธอด (Method)” แทน เพราะว่ามันถูกประกาศอยู่ภายในคลาส!) เราสามารถใช้เมธอดเปลี่ยนข้อมูลประจำตัวหรือแอตทริบิวต์ของออบเจ็กต์ เช่น หากเราต้องการเพิ่มรัศมีให้กับวงกลม เราก็แค่สร้างเมธอดที่ชื่อ add_radius(r) เพื่อปรับรัศมีให้เพิ่มขึ้นอีก r หน่วย เป็นต้น
ออบเจ็กต์จะเรียกใช้เมธอดได้ด้วยการเขียนเครื่องหมายจุด (.) ต่อท้ายชื่อของออบเจ็กต์ (เป็นการบอกว่าออบเจ็กต์นั้นผู้เรียกนั่นเอง)
(รุป) ออบเจ็กต์เรียกเมธอด add_raius( )
การสร้างคลาส – คลาสวงกลม (Circle Class) สำหรับออบเจ็กต์วงกลม#
ก่อนที่จะอธิบายการสร้างคลาสวงกลม ให้ import
Module (โมดูล)☀︎ ที่ใช้ในการวาดรูปให้เข้ามาในโปรแกรมก่อน
☀︎โมดูล (Module) หรือ แพคเกจ (Package) หรือ ไลบรารี่ (Library) เปรียบเสมือนโปรแกรมสำเร็จรูป (อาจจะมีแค่หนึ่งไฟล์หรือสิบไฟล์หรือมากถึงร้อยไฟล์ก็ได้) ที่เก็บฟังก์ชัน คลาส ตัวแปรและค่าพิเศษต่างๆ เฉพาะทางไว้
โมดูลของไพธอนมีทั้งที่ถูกพัฒนาโดยผู้พัฒนาหลัก (Core Developer) และผู้ใช้งานทั่วไป โดยจะถูกอัพโหลดขึ้นไปเก็บไว้ในเซอร์เวอร์ Python Package Index (เรียกย่อๆว่า “PyPI”; the official 3rd-party software repository!) หรือไม่ก็เซอร์เวอร์ของ Anaconda Cloud ประโยชน์ของโมดูล คือผู้ใช้งานไม่จำเป็นที่จะต้องสร้างโมดูล (ฟังก์ชั่นหรือคลาส) ขึ้นมาใหม่เองทั้งหมด แต่สามารถนำโมดูลที่ถูกพัฒนาไว้อยู่แล้วมาใช้งานได้เลย
โมดูลที่เป็น 3rd-party สามารถติดตั้ง (Install) ได้เองโดยใช้คำสั่งต่อไปนี้
pip install ชื่อของโมดูล
สำหรับคนที่ใช้ไพธอนของ Python.orgconda install ชื่อของโมดูล
สำหรับคนที่ใช้ไพธอนของ Anaconda
(ยกเลิกการติดตั้ง (Unininstall) ก็สามารถทำได้โดยใช้คำสั่ง
uninstall
)
ตัวอย่างของโมดูลยอดนิยมที่ผู้เขียนไพธอนทั่วไปนิยมใช้ (แยกตามประเภทของการใช้งาน) มีดังต่อไปนี้
การจัดการข้อมูลและวิเคราะห์ข้อมูล (รูปแบบตาราง) (Data Manipulation): Pandas
การดึงข้อมูลจาก web (Web Scraping): Requests, Selenium, Beautiful Soup, lxml
การคำนวณทางคณิตศาสตร์และสถิติ (Mathematics and Statistics): NumPy (คำนวน Vector และ Matrix), SciPy
การสร้างแบบจำลองทางคณิตศาตร์สำหรับเรียนรู้ของเครื่องจักร (Machine Learning Framework): Scikit-Learn
การสร้างแบบจำลองสำหรับการเรียนรู้เชิงลึก(Deep learning): TensorFlow, Keras (High-level interface of TensorFlow), PyTorch
การแสดงผลข้อมูล/พล็อตกราฟ (Data Visualization): Matplotlib, Seaborn, ggplot
การสร้าง GUI (Graphical User Interface/Front-ends/User interface): TKinter (TKinter + ttk), Streamlit (Web Application)
ณ ที่นี้เราจะใช้ matplotlib ในการวาดรูป (พล็อตกราฟ)
# Import the library
import matplotlib.pyplot as plt
# %matplotlib inline # Using this command ensures that Jupyter Notebooks show your plots.
Note:
Magic Commands ☜
%matplotlib inline
เป็นคำสั่งที่ใช้เฉพาะในกรณีที่รันภายใต้ IPython (Interactive Python) เช่น Jupyter notebook, JupyterLab, Google Colaboratory (Colab) เมื่อรันคำสั่งนี้ จะทำให้ผลลัพธ์ของการพล็อตแสดงในเซลล์เอาต์พุตและบันทึกเก็บในโน้ตได้
Magic Commands อื่นๆ เช่น %system date
(ดูรายละเอียดในลิงค์ข้างบน)
ในสร้างคลาส เราจะใช้คีย์เวิร์ด class
ตามด้วยชื่อของคลาส ClassName
และปิดท้ายชื่อด้วยเครื่องหมาย colon (:
) ดังแสดงในรูปด้านล่าง เพื่อบอกว่าจะเริ่มบล็อกคำสั่งของคลาสแล้ว
บล็อกคำสั่งของคลาสจะเป็นคำสั่งที่เกี่ยวกับการกำหนดตัวแปรและเมธอดของคลาสโดยจะอยู่เยื้องย่อหน้าเข้าไป (Indentation)
การตั้งชื่อคลาสจะใช้กฎเดียวกับการตั้งชื่อของตัวแปร เราสามารถตั้งชื่อของคลาสเป็นอะไรก็ได้ แต่ควรตั้งชื่อที่สื่อความหมาย และ…มักตั้งชื่อคลาสที่ขึ้นต้นด้วยตัวพิมพ์ใหญ่และเป็นสไตล์แบบหลังอูฐ (CamelCase)
ในขณะที่ ชื่อเมธอดมักจะตั้งชื่อให้ขึ้นต้นด้วยตัวอังกฤษพิมพ์เล็กและมักเป็นเป็นกริยา เช่น add…, get…
คลาสจะต้องถูกรันก่อนที่จะมีการเรียกใช้ เช่นเดียวกับฟังก์ชั่น
Class syntax:
class ClassName:
def method_name1(self, arg1, arg2, ..)
<statements>
def method_name2(self, arg1, arg2, ..)
<statements>.
.
.
.
ตัวอย่างการประกาศคลาส Circle
ภายในคลาส Circle
มีเมธอดพิเศษที่เรียกว่า คอนสตรักเตอร์ (Constructor)☀︎ __init__( )
ซึ่งเป็นเมธอดที่จะถูกเรียกอัตโนมัติเมื่อมีการสร้างออบเจ็กต์ มักจะใช้กำหนดแอตทริบิวต์และค่าเริ่มต้นให้กับออบเจ็คที่สร้างขึ้น พารามิเตอร์แรกของเมธอด __init__( )
จะเป็น self เสมอ ซึ่งเป็นตัวแปรที่ใช้ในการอ้างถึงออบเจ็คที่ถูกสร้างขณะนั้น คลาสที่ประกาศขึ้นนี้มีสองแอตทริบิวต์คือ radius
และ color
ใช้สำหรับเก็บค่ารัศมีและสีของแต่ละออบเจ็กต์ (วงกลม) เราสามารถเข้าถึงแอตทริบิวต์ radius
ได้โดยใช้ syntax self.radius
และเข้าถึงแอตทริบิวต์ color
ได้โดยเขียน self.color
นอกจากนี้ เรายังมีเมธอด add_radius( )
ที่มีพารามิเตอร์เป็น r
เมธอดนี้จะบวกเพิ่ม r
ให้กับแอตทริบิวต์ radius
☀︎ คำศัพท์ที่เกี่ยวข้อง
คอนสตรักเตอร์ (Constructor) หมายถึง เมธอดหรือฟังก์ชันแรกที่ถูกเรียกใช้ทุกครั้งโดยอัตโนมัติเมื่อมีการสร้างออบเจ็กต์ เพื่อกำหนดแอตทริบิวต์/ค่าเริ่มต้นให้กับออบเจ็คที่สร้างขึ้น การสร้างคอนสตรัคเตอร์ในภาษาไพธอนจะใช้คำสั่ง
__init__( )
(ขีดล่าง _ สองขีด ทั้งหน้าและหลัง!)ดีสตรัคเตอร์ (Destructor) หมายถึง เมธอดหรือฟังก์ชันที่ถูกเรียกใช้โดยอัตโนมัติเมื่อมีการลบออบเจ็กต์ หรือออบเจ็กต์ที่ประกาศไว้หมดอายุการใช้งาน เพือจัดการทําลายคอนสตรักเตอร์ (ล้างตัวแปรและคืนหน่วยความจำสู่ระบบ) การสร้างดีสตรัคเตอร์ในภาษาไพธอนจะใช้คำสั่ง
__del__( )
เราเขียนเมธอด drawCircle( )
เพิ่มเข้าไปในคลาสเพื่อแสดงภาพของวงกลม และกำหนดค่ารัศมีเริ่มต้นเป็น 3 และสีเริ่มต้นเป็นสีน้ำเงิน
# Create a class Circle
# class Circle(object): # Python 2
class Circle:
"""
The class Circle has the attribute radius and color,
the method add_radius(r) to increases the radius by r,
the method drawCircle() to display the image of a circle.
"""
# Constructor
def __init__(self, radius=3, color='blue'):
self.radius = radius
self.color = color
# Method
def add_radius(self, r):
self.radius = self.radius + r
return(self.radius)
# Method
def drawCircle(self):
plt.gca().add_patch(plt.Circle((0, 0), radius=self.radius, fc=self.color)) # Add the patch to the Axes
plt.axis('scaled') # Setting the axis to “scaled” ensures that you can see the added shape properly.
plt.show()
เมื่อกำหนดคลาสเสร็จ ต่อไปเราจะนำคลาสไปสร้างออบเจ็กต์
ตัวอย่างการใช้ Matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
# plot is a versatile function, and will take an arbitrary number of arguments.
# For example, to plot x versus y, you can write:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.show()
# To plot f1(t) = t, f2(t) = t^2, f3(t) = t^3
# t = range(0, 5, 0.2) # If you use range() with float step argument, you will get a TypeError 'float' object cannot be interpreted as an integer.
# Use NumPy’s arange() orlinspace() functions to use decimal numbers in a start,
# stop and step argument to produce a range of floating-point numbers.
import numpy as np
t = np.arange(0., 5., 0.2)
t
array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4,
2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8])
# evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)
# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
รายละเอียดการใช้ Matplotlib ดูเพิ่มเติมที่ Matplotlib Tutorials
การสร้างตัวแปรออบเจ็กต์จากคลาส#
สร้างตัวแปรออบเจ็กต์ RedCircle
จากคลาส Circle
# Create an object RedCircle
RedCircle = Circle(10, 'red')
เราสามารถใช้ฟังก์ชัน dir( )
เพื่อรับลิสต์ของเมธอดทั้งหมดที่มีอยู่ในออบเจ็กต์ หลายเมธอดของออบเจ็กต์เป็นดีฟอลต์เมธอดของไพธอน
# Find out the methods can be used on the object RedCircle
dir(RedCircle)
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'add_radius',
'color',
'drawCircle',
'radius']
ในภาษา Python สามารถตรวจสอบ attributes ภายในออบเจ็กต์ได้ โดยใช้คำสั่ง _dict_( )
ดูการใช้งาน Docstrings ได้โดยใช้คำสั่ง _doc_( )
(การประกาศ Docstrings ใช้ triple single quotes (‘’’…’’’) หรือ triple double quotes (“””…”””) เหมือนฟังก์ชัน)
print(RedCircle.__dict__) # {'radius': 10, 'color': 'red'}
print(RedCircle.__doc__) # Class Docstrings
{'radius': 10, 'color': 'red'}
The class Circle has the attribute radius and color,
the method add_radius(r) to increases the radius by r,
the method drawCircle() to display the image of a circle.
# Create one more object RedCircle
GreenCircle = Circle(20, 'green')
คลาสหนึ่งคลาสสามารถนำไปสร้างเป็นออบเจ็คกี่อันก็ได้ ซึ่งถือว่าเป็นแนวคิดที่สำคัญของการเขียนโปรแกรมเชิงวัตุในการนำโค้ดกลับมาใช้ซ้ำได้
ตามที่ได้กล่าวไว้ตอนต้นๆ ว่า แอตทริบิวต์เป็นตัวแปรของคลาส (ณ ที่นี้คือ radius
และ color
) เป็นข้อมูลสาธารณะ ดังนั้นเราสามารถเข้าถึงข้อมูลจากภายนอกคลาสได้
# Print the object attribute radius
RedCircle.radius
10
# Print the object attribute color
RedCircle.color
'red'
และสามารถเปลี่ยนค่าของแอตทริบิวต์ได้เช่นกัน
# Set the object attribute radius
RedCircle.radius = 1
RedCircle.radius
1
ลองวาดออบเจ็กต์นี้โดยเรียกเมธอด drawCircle()
:
# Call the method drawCircle
RedCircle.drawCircle()
เราสามารถเพิ่มรัศมีของวงกลมได้โดยใช้เมธอด add_radius()
. ลองเพิ่มรัศมีอีก 2 หน่วย แล้วเพิ่มต่ออีก 5 หน่วย ดูว่าสุดท้ายรัศมีจะเป็นเท่าไหร่
# Use method to change the object attribute radius
print('Radius of object:',RedCircle.radius)
RedCircle.add_radius(2)
print('Radius of object of after applying the method add_radius(2):',RedCircle.radius)
RedCircle.add_radius(5)
print('Radius of object of after applying the method add_radius(5):',RedCircle.radius)
Radius of object: 1
Radius of object of after applying the method add_radius(2): 3
Radius of object of after applying the method add_radius(5): 8
เรามาสร้างวงกลมสีน้ำเงินเพิ่มอีกอัน
เนื่องจากสีเริ่มต้นเป็นสีน้ำเงินอยู่แล้ว จึงแค่ส่งอาร์กิวเมนต์ radius
ตามที่ต้องการ
# Create a blue circle with a given radius
# BlueCircle = Circle(100)
BlueCircle = Circle(radius=100)
เช่นเดียวกับก่อนหน้า เราสามารถเข้าถึงข้อมูลของออบเจ็กต์โดยใช้เครื่องหมายจุด (.) ต่อท้ายชื่อของออบเจ็กต์
# Print the object attribute radius
BlueCircle.radius
100
# Print the object attribute color
BlueCircle.color
'blue'
แน่นอน ทุกออบเจ็กต์ที่สร้างขึ้นมาสามารถเรียกใช้เมธอด drawCircle()
ได้
# Call the method drawCircle
BlueCircle.drawCircle()
ดูที่สเกล มีขนาดต่างกับ RedCircle
คลาสสี่เหลี่ยมผืนผ้า (Rectangle Class)#
สร้างคลาสสี่เหลี่ยมผืนผ้า Class Regtangle
โดยให้มีแอตทริบิวต์ height
, width
และ color
และมีเมธอด
สำหรับวาดรูปออบเจ็กต์สี่เหลี่ยมผืนผ้า
# Create a new Rectangle class for creating a rectangle object
class Rectangle:
# Constructor
def __init__(self, width=2, height=3, color='red'):
self.height = height
self.width = width
self.color = color
# Method
def drawRectangle(self):
plt.gca().add_patch(plt.Rectangle((0, 0), self.width, self.height ,fc=self.color))
plt.axis('scaled')
plt.show()
สร้างตัวแปรออบเจ็กต์สี่เหลี่ยมผืนผ้า SkinnyBlueRectangle
มีความกว้าง (width) 2 และความสูง (height) และสีน้ำเงิน (blue)
# Create a new object rectangle
SkinnyBlueRectangle = Rectangle(2, 10, 'blue')
เช่นเดียวกับก่อนหน้า เราสามารถเข้าถึงข้อมูลของออบเจ็กต์โดยใช้เครื่องหมายจุด (.) ต่อท้ายชื่อของออบเจ็กต์
# Print the object attribute height
SkinnyBlueRectangle.height
10
# Print the object attribute width
SkinnyBlueRectangle.width
2
# Print the object attribute color
SkinnyBlueRectangle.color
'blue'
สามารถวาดออบเจ็กต์ SkinnyBlueRectangle
ได้
# Use the drawRectangle method to draw the shape
SkinnyBlueRectangle.drawRectangle()
ลองสร้างออบเจ็กต์สี่เหลี่ยมผืนผ้าอีกอัน FatYellowRectangle
# Create a new object rectangle
FatYellowRectangle = Rectangle(20, 5, 'yellow')
เข้าถึงข้อมูลของออบเจ็กต์โดยใช้เครื่องหมายจุด (.) ต่อท้ายชื่อของออบเจ็กต์
# Print the object attribute height
FatYellowRectangle.height
5
# Print the object attribute width
FatYellowRectangle.width
20
# Print the object attribute color
FatYellowRectangle.color
'yellow'
# Use the drawRectangle method to draw the shape
FatYellowRectangle.drawRectangle()
[Exercises] - Class OKOKOK#
จากคลาส
ForEver
ต่อไปนี้???
class HelloForEver:
def readline(self):
return 'Hello.\n'
ถ้าสร้างตัวแแปรออบเจ็กต์ f ขึ้นมา จากนั้นรันตามโค้ตต่อไปนี้ ผลลัพธ์จะเป็นอย่างไร?
f = HelloForEver()
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
# Write your code below. Don't forget to press Shift+Enter to execute the cell
จากคลาส
HelloFile
ต่อไปนี้???
class HelloFile:
def __init__(self, n):
self.n = n
def readline(self):
if self.n == 0:
return ''
self.n = self.n - 1
return 'Hello.\n'
ถ้าสร้างตัวแแปรออบเจ็กต์ f ขึ้นมา หลังจากนั้นรันตามโค้ตต่อไปนี้ ผลลัพธ์จะเป็นอย่างไร?
f = HelloFile(3)
print(f.n)
print(f.readline())
print(f.readline())
print(f.n)
print(f.readline())
print(f.readline())
print(f.n)
print(f.n)
# Write your code below. Don't forget to press Shift+Enter to execute the cell
จงสร้างคลาส
Car
ที่ยังไม่มีตัวแปรและเมธอดใดๆ
# Write your code below. Don't forget to press Shift+Enter to execute the cell
4 จงสร้าคลาส Car
ที่มีแอตทริบิวต์ (Attributes (Variables)) ชื่อรถ name
ความเร็วสูงสุด (km/H) max_speed
และอัตราการสิ้นเปลืองเชื้อเพลิง (km/L) mileage
# Write your code below. Don't forget to press Shift+Enter to execute the cell
class Car:
def __init__(self, name, max_speed, mileage):
### BEGIN SOLUTION
pass
### END SOLUTION
# modelH1 = Car('Honda City', 240, 18)
# print(modelH1.name, modelH1.max_speed, modelH1.mileage)
5 จากข้อก่อนหน้า จงเปลี่ยนแอตทริบิวต์ความเร็วสูงสุดให้เป็นเมธอดความเร็วสูงสุด max_speed()
และเปลี่ยนแอตทริบิวต์อัตราการสิ้นเปลืองเชื้อเพลิงให้เป็นเมธอดอัตราการสิ้นเปลืองเชื้อเพลิง ‘mileage’ แทน และเพิ่มเมธอด description()
ส่งค่ากลับเป็นข้อความ “รถ name วิ่งที่ความเร็วสูงสุด max_speed km/H มีอัตราการสิ้นเปลืองเชื้อเพลิง mileage km/L”
# Write your code below. Don't forget to press Shift+Enter to execute the cell
class Car:
### BEGIN SOLUTION
pass
### END SOLUTION
# obj2 = Car("Honda City")
# obj2.mileage(18)
# obj2.max_speed(240)
# print(obj2.name, obj2.max_speed, obj2.mileage)
# print(obj2.description())