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__ และหายไปเมื่อมันคืนค่า