คลาสและออบเจ็ค (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.org

    • conda 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()
_images/Ch10_Classes_v01_34_0.png
# 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()
_images/Ch10_Classes_v01_37_0.png

รายละเอียดการใช้ 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()
_images/Ch10_Classes_v01_54_0.png

เราสามารถเพิ่มรัศมีของวงกลมได้โดยใช้เมธอด 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()
_images/Ch10_Classes_v01_63_0.png

ดูที่สเกล มีขนาดต่างกับ 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()
_images/Ch10_Classes_v01_76_0.png

ลองสร้างออบเจ็กต์สี่เหลี่ยมผืนผ้าอีกอัน 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()
_images/Ch10_Classes_v01_83_0.png

[Exercises] - Class OKOKOK#

  1. จากคลาส 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
  1. จากคลาส 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
  1. จงสร้างคลาส 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())

Author#

S.C.

Change Log#

Date

Version

Change Description

25-12-2021

0.1

First edition