2.20. First class¶
คลาส จัดกลุ่มข้อมูลและฟังก์ชันที่ทำงานกับข้อมูลนั้นภายใต้ชื่อเดียว การใช้คลาสคุ้มค่าเมื่อข้อมูลหลายส่วนต้องอยู่ด้วยกันและฟังก์ชันส่วนใหญ่ใน script รับชุดค่าเดียวกันนั้นเป็นอาร์กิวเมนต์
2.20.1. คีย์เวิร์ด class¶
คีย์เวิร์ดคือ class เนื้อหาประกอบด้วยเมธอด __init__ ที่ทำงานทุกครั้งที่สร้าง instance ใหม่:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
ผลลัพธ์:
3 4
Point คือคลาส p คือ instance ของมัน วงเล็บในการเรียก Point(3, 4) เรียก __init__ ซึ่งกำหนดอาร์กิวเมนต์ให้กับ attribute ของ instance ใหม่ self คือชื่อตามธรรมเนียมสำหรับ instance self.x ตั้ง attribute ที่เมธอดอื่นๆ ของ instance จะอ่าน
2.20.2. เมื่อใดควรใช้คลาส¶
ควรใช้คลาสเมื่อเงื่อนไขเหล่านี้เป็นจริงพร้อมกัน:
ค่าที่เกี่ยวข้องกันไม่กี่ค่าเดินทางไปด้วยกันทุกที่ (ค่า
xและyของจุด ค่า หน่วย และ timestamp ของการอ่านค่า sensor)ฟังก์ชันหลายตัวรับชุดค่าเดียวกันนั้นและทำงานกับมัน
มีประโยชน์ที่จะเก็บมากกว่าหนึ่ง bundle ของสิ่งเหล่านี้ให้มีชีวิตอยู่ในเวลาเดียวกัน แยกจากกัน
ถ้าข้อมูลเป็นแบบครั้งเดียว dict หรือ tuple ธรรมดามักจะพอเพียง ถ้าคุณต้องการเพียง bundle เดียวของค่าคงที่ ตัวแปรระดับโมดูลก็ใช้ได้ คลาสไม่ใช่คอนเทนเนอร์เริ่มต้น -- มันพิสูจน์ตัวเองเมื่อสถานะและพฤติกรรมต้องการอยู่ด้วยกัน
2.20.3. __init__ ทำอะไร¶
__init__ เป็นเพียงเมธอดธรรมดา อะไรก็ตามที่กำหนดให้ self ภายในมันจะกลายเป็น attribute ของ instance ใหม่:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
ผลลัพธ์:
temperature C []
readings ถูกเริ่มต้นเป็นลิสต์ว่าง -- instance ใหม่แต่ละตัวได้รับลิสต์ของตัวเองไม่ใช่ลิสต์ร่วมกัน อะไรที่ไม่ได้กำหนดให้ self เป็น local ของ __init__ และหายไปเมื่อมันคืนค่า