ในการบรรยายนี้ เราจะเรียนรู้เกี่ยวกับคลาส ตัวสร้าง และการสืบทอดใน python
แนวคิดเหล่านี้มีความสำคัญอย่างยิ่งในโปรแกรมขนาดใหญ่ซึ่งจำเป็นต้องกำหนดประเภทที่แตกต่างกัน
เรียน
คลาสมีความสำคัญในการเขียนโปรแกรมและไม่เฉพาะเจาะจงกับ python อื่น ๆ อีกมากมาย การเขียนโปรแกรมภาษา สนับสนุนแนวคิดของชั้นเรียน เราใช้คลาสเพื่อกำหนดประเภทข้อมูลใหม่
จนถึงตอนนี้ เราได้เรียนรู้เกี่ยวกับชนิดข้อมูลพื้นฐานใน Python เช่น ตัวเลข สตริง และบูลีน เหล่านี้เป็นประเภทข้อมูลพื้นฐานหรืออย่างง่ายใน Python เราได้เห็นประเภทข้อมูลที่ซับซ้อนสองสามประเภท เช่น รายการและพจนานุกรม
แม้ว่าประเภทเหล่านี้จะมีประโยชน์อย่างยิ่ง แต่ก็ไม่สามารถใช้เพื่อสร้างแบบจำลองแนวคิดที่ซับซ้อนได้เสมอไป ตัวอย่างเช่น คิดเกี่ยวกับแนวคิดของจุดหรือตะกร้าสินค้า ตะกร้าสินค้าไม่ใช่บูลีนหรือรายการ เป็นข้อมูลประเภทอื่น ดังนั้นเราจึงสามารถใช้คลาสเพื่อกำหนดประเภทใหม่เพื่อสร้างแบบจำลองแนวคิดที่แท้จริง
ตอนนี้ มากำหนดชนิดข้อมูลใหม่ที่เรียกว่าจุด ชนิดใหม่นี้จะมีวิธีการที่เราตรวจสอบก่อนหน้านี้
นี่คือวิธีที่คุณจะทำ:
เราเริ่มต้นด้วยการกำหนดคลาสโดยใช้คีย์เวิร์ด "คลาส" และหลังจากนั้นเราจะตั้งชื่อคลาสของเรา
class Point
ทีนี้ ดูแบบแผนการตั้งชื่อที่ฉันใช้ที่นี่ ฉันพิมพ์อักษรตัวแรกตรงนี้ นี่คือสิ่งที่เรียกว่าแบบแผนการตั้งชื่อแบบปาสกาล แบบแผนนี้แตกต่างจากแบบที่เราใช้ในการตั้งชื่อตัวแปรและฟังก์ชันซึ่งเราใช้อักษรตัวพิมพ์เล็กเสมอและแยกคำหลายคำโดยใช้ขีดล่าง แต่เมื่อตั้งชื่อคลาส เราไม่ใช้ขีดล่างเพื่อแยกคำหลายคำแทน เราทำให้ตัวอักษรตัวแรกของทุกคำเป็นตัวพิมพ์ใหญ่
หลังจากกำหนดคลาสของเราแล้ว มีการใช้โคลอน ซึ่งหมายความว่าขณะนี้มีการกำหนดบล็อกแล้ว
class Point:
def move (self):
ในบล็อกนี้ เราสามารถกำหนดฟังก์ชันหรือวิธีการทั้งหมดที่เป็นของจุด ตัวอย่างเช่น เราสามารถกำหนดฟังก์ชันที่เรียกว่า "ย้าย" สำหรับการย้ายจุด โปรดทราบว่าทันทีที่เราพิมพ์วงเล็บเปิด PyCharm จะเพิ่ม "ตัวเอง" ที่นี่โดยอัตโนมัติ นี่เป็นคีย์เวิร์ดพิเศษและขอให้กลับมาอ่านเร็วๆ นี้ มาพิมพ์คำว่า "ย้าย" ที่เทอร์มินัลกันเถอะ
print("move")
มากำหนดวิธีการอื่นเช่น "วาด" แล้วพิมพ์บนเทอร์มินัล
def draw(self):
print("draw")
จบด้วยคำจำกัดความของคลาส "จุด" ของเราแล้ว ด้วยรูปแบบใหม่นี้ เราสามารถสร้างวัตถุใหม่ได้ คลาสเพียงแค่กำหนดพิมพ์เขียวหรือเทมเพลตสำหรับการสร้างวัตถุที่เป็นอินสแตนซ์จริงตามพิมพ์เขียวนั้น ในการสร้างวัตถุ เราพิมพ์ชื่อคลาสของเราแล้วเรียกมันเหมือนกับฟังก์ชัน สิ่งนี้สร้างวัตถุใหม่แล้วส่งคืน จากนั้นเราสามารถเก็บวัตถุนั้นไว้ในตัวแปรได้ ให้ผมแสดง:
ที่นี่เราได้กำหนด "point1" ซึ่งเป็นจุดสามมิติ คุณจะเห็นได้ว่าเราสามารถพิมพ์แต่ละพิกัดบนเทอร์มินัลได้
เราสามารถใช้สองวิธี "วาด" และ "ย้าย" กับจุดนี้
สรุป เราใช้คลาสเพื่อกำหนดประเภทใหม่และประเภทเหล่านี้สามารถมีวิธีที่เรากำหนดในเนื้อหาของคลาส ชั้นเรียนสามารถมีคุณลักษณะที่เราตั้งค่าได้ทุกที่ในโปรแกรมของเรา
ตัวสร้าง
จนถึงตอนนี้ เราได้เรียนรู้วิธีสร้างประเภทใหม่โดยใช้ชั้นเรียนแล้ว ขณะนี้มีปัญหาเล็กน้อยในการดำเนินการนี้ เราสามารถสร้างวัตถุจุดโดยไม่มีพิกัด x หรือ y โดยใช้คลาส และนั่นไม่เหมาะ ให้ผมแสดง.
มาสร้างจุดและพิมพ์มันก่อนที่เราจะตั้งค่าพิกัด x การรันโปรแกรมของเราส่งผลให้เกิดข้อผิดพลาดเกี่ยวกับแอตทริบิวต์ดังนี้:
หมายความว่าวัตถุจุดไม่มีแอตทริบิวต์ที่เรียกว่า x ตอนนี้ปัญหาคือมันเป็นไปได้ที่จะมีวัตถุจุดโดยไม่มีพิกัด x หรือ y มันไม่สมเหตุสมผลเลย เพราะเมื่อใดก็ตามที่เราพูดถึงประเด็นใดประเด็นหนึ่ง เราจำเป็นต้องรู้ว่าจุดนั้นอยู่ที่ใด เพื่อแก้ปัญหานี้ เราใช้ตัวสร้าง ตัวสร้างเป็นฟังก์ชันที่ได้รับการเรียกในขณะที่สร้างวัตถุ
นี่คือวิธีที่เราใช้ตัวสร้าง ขั้นแรก ให้ส่งค่าพิกัด x และ y ในโปรแกรมข้างต้น
point = Point(10, 20)
print(point.x)
ตอนนี้ เราต้องเพิ่มเมธอดพิเศษในคลาสนี้ที่เรียกว่า constructor ไวยากรณ์มันเป็นดังนี้:
def __init__(self, x, y):
init
ย่อมาจาก initialized และนี่คือฟังก์ชันหรือเมธอดที่ถูกเรียกเมื่อวัตถุจุดใหม่ถูกสร้างขึ้น x และ y จะถูกเพิ่มหลังจากนั้น self
เพื่อเพิ่มพารามิเตอร์พิเศษสองตัว
หลังจากนั้น เราควรแมป x และ y กับค่าที่ส่งผ่าน เช่น 10 และ 20
self.x = x
self.y = y
เราใช้ self
เพื่ออ้างถึงวัตถุปัจจุบัน จากนั้นเราตั้งค่าแอตทริบิวต์ x เป็นอาร์กิวเมนต์ x ที่ส่งผ่านไปยังฟังก์ชัน "x" ด้วยวิธีนี้โดยใช้ init
วิธีเราสามารถเริ่มต้นวัตถุของเราได้ วิธีนี้เรียกว่าคอนสตรัคเตอร์ มาเรียกใช้โปรแกรมของเรากัน
ตอนนี้ เราสามารถเปลี่ยนพิกัด x และ y ได้ในภายหลัง มาอัปเดตพิกัด x กันเถอะ:
point = Point(10, 20)
point.x = 11
print(point.x)
ตอนนี้ พิกัด x ถูกอัพเดตเป็นค่า 11
การออกกำลังกาย
นี่คือแบบฝึกหัดที่น่าสนใจสำหรับคุณ
ฉันต้องการให้คุณกำหนดรูปแบบใหม่ที่เรียกว่าบุคคล วัตถุ "บุคคล" เหล่านี้ควรมี "name
” แอตทริบิวต์เช่นเดียวกับ “talk()
" วิธี.
เป็นงานง่ายๆ และไม่ควรใช้เวลาเกินสองสามนาที
Solution
เริ่มต้นด้วยการกำหนดคลาส "บุคคล" ดังนี้:
class Person:
self.name = name
เราจะกำหนดตัวสร้างในภายหลัง ตอนนี้ เราสามารถสร้างวัตถุ "บุคคล" ได้แล้ว เรียกมันว่าจอห์น
john = Person("John Smith")
print(john.name)
john.talk()
ไปที่ส่วนแรกของโค้ดแล้วสร้างตัวสร้าง
def __init__(self, name):
รหัสสุดท้ายจะมีลักษณะดังนี้:
คุณยังสามารถใช้สตริงที่จัดรูปแบบและแนวคิดอื่นๆ ร่วมกับคลาสและตัวสร้าง
มรดก
การสืบทอดเป็นแนวคิดอื่นที่เกี่ยวข้องกับคลาสที่ช่วยให้คุณใช้รหัสซ้ำได้
พิจารณาโค้ดชิ้นนี้
class Dog:
def walk(self):
print("walk")
เราได้สร้างคลาส "Dog" ด้วยวิธีการ "เดิน" ในวิธีนี้ เราเพียงแค่พิมพ์ข้อความเดินบนเทอร์มินัล สมมุติว่าในโปรแกรมจริง มีโค้ด 10 บรรทัดแทนที่จะเป็นบรรทัดเดียว ในอนาคต หากต้องการคลาสอื่นเพื่อให้มีวิธี "เดิน" เราจะต้องทำซ้ำโค้ดทั้งหมดนั้น นี้ไม่เหมาะ
ในการเขียนโปรแกรม เรามีหลักการที่เรียกว่า DRY ซึ่งย่อมาจาก Don'tทำซ้ำตัวเอง สมมุติว่าคราวหน้าเราพบปัญหากับวิธีการ “เดิน” ของเรา และหากเราทำซ้ำหรือทำซ้ำวิธีนี้ในหลายๆ ที่ เราจะต้องกลับมาแก้ไขปัญหานี้ในทุกที่ที่เราทำซ้ำ รหัส. นั่นคือเหตุผลที่ในการเขียนโปรแกรมเราไม่ควรกำหนดบางสิ่งบางอย่างสองครั้ง
มีวิธีการต่างๆ ในการแก้ไขปัญหานี้ แต่ในที่นี้เราจะมาเรียนรู้วิธีที่ง่ายกว่าสำหรับผู้เริ่มต้นและเรียกว่าการสืบทอด ในกรณีนี้ เราจะสร้าง "สัตว์เลี้ยงลูกด้วยนม" คลาสอื่นและกำหนดแอตทริบิวต์ "เดิน" ของเราในคลาสนั้น
class Mammal:
def walk(self):
print("walk")
หลังจากกำหนดคลาส "สัตว์เลี้ยงลูกด้วยนม" ของเราแล้ว เราสามารถใช้มรดกเพื่อส่งต่อแอตทริบิวต์ดังนี้:
ทั้งคลาส dog และ cat สืบทอดคลาส method ทั้งหมดที่กำหนดไว้ในคลาส parent ตอนนี้ เราสามารถเพิ่มวิธีการเฉพาะสำหรับสุนัขได้ดังนี้:
class Dog:
def bark(self):
print("bark")
สรุป!
ทั้งหมดนี้เกี่ยวกับคลาส คอนสตรัคเตอร์ และการนำโค้ดกลับมาใช้ใหม่ในคลาสที่มีแนวคิดการสืบทอด ตอนนี้เราใกล้จะสิ้นสุดซีรีส์ของเราแล้ว เมื่อถึงจุดนี้ คุณควรจะสามารถสร้างโค้ดที่ดี อ่านได้ และกระชับใน Python
เราจะเห็นแนวคิดของโมดูลและแพ็คเกจในการบรรยายครั้งต่อไป
เขียนความเห็น