0Pricing
Python Academy · บทเรียน

รูปแบบคลาส

จับคู่กับแอตทริบิวต์ของออบเจกต์

รูปแบบคลาส เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

การจับคู่อ็อบเจกต์

รูปแบบคลาสช่วยให้ match ตรวจสอบชนิดของอ็อบเจกต์และดึงแอตทริบิวต์ออกมาได้ในขั้นตอนเดียว รูปแบบเหล่านี้มีลักษณะเหมือนการเรียกตัวสร้างภายในกรณี

การตรวจสอบชนิดเท่านั้น

รูปแบบคลาสที่มีวงเล็บว่างจะจับคู่กับอินสแตนซ์ใด ๆ ของคลาสนั้น

def kind(value):
    match value:
        case int():
            return 'an integer'
        case str():
            return 'a string'
        case _:
            return 'something else'

print(kind(5))
print(kind('hi'))
print(kind([1]))

การจับแอตทริบิวต์ด้วยชื่อ

ภายในวงเล็บ ให้เขียน attr=name เพื่อจับคู่อินสแตนซ์และผูกแอตทริบิวต์ที่ระบุชื่อไว้กับตัวแปร

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(3, 4)

match p:
    case Point(x=px, y=py):
        print('point at', px, py)

การจับคู่ค่าแอตทริบิวต์ที่เจาะจง

คุณสามารถกำหนดให้แอตทริบิวต์ต้องเท่ากับค่าลิเทอรัลได้ กรณีนี้จะจับคู่เฉพาะจุดที่อยู่บนแกน x

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

def describe(p):
    match p:
        case Point(x=0, y=0):
            return 'origin'
        case Point(x=x, y=0):
            return 'on x-axis at ' + str(x)
        case Point():
            return 'elsewhere'

print(describe(Point(0, 0)))
print(describe(Point(5, 0)))
print(describe(Point(1, 1)))

รูปแบบตามตำแหน่งด้วย __match_args__

หากคลาสกำหนด __match_args__ คุณจะสามารถจับคู่แอตทริบิวต์ตามตำแหน่งได้ คลาสข้อมูลจะกำหนดค่านี้โดยอัตโนมัติตามลำดับของฟิลด์

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(3, 4)

match p:
    case Point(px, py):
        print(px, py)

การกำหนด __match_args__ ด้วยตนเอง

สำหรับคลาสทั่วไป ให้กำหนด __match_args__ เป็นทูเพิลที่ระบุชื่อแอตทริบิวต์ที่ต้องการให้เรียกใช้ตามตำแหน่งได้

class Point:
    __match_args__ = ('x', 'y')
    def __init__(self, x, y):
        self.x = x
        self.y = y

match Point(1, 2):
    case Point(a, b):
        print(a, b)

การกระจายคำสั่งตามคลาส

รูปแบบคลาสช่วยสร้างตัวกระจายคำสั่งที่ชัดเจนสำหรับกลุ่มชนิดที่เกี่ยวข้องกัน โดยแต่ละชนิดจะได้รับการจัดการในกรณีของตนเอง

from dataclasses import dataclass

@dataclass
class Circle:
    radius: float

@dataclass
class Square:
    side: float

def area(shape):
    match shape:
        case Circle(radius=r):
            return 3.14159 * r * r
        case Square(side=s):
            return s * s

print(area(Circle(2)))
print(area(Square(3)))

การซ้อนรูปแบบคลาส

รูปแบบคลาสสามารถซ้อนกันได้ ฟิลด์ที่เป็นอ็อบเจกต์อยู่แล้วสามารถจับคู่ด้วยรูปแบบคลาสอีกแบบหนึ่ง

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

@dataclass
class Line:
    start: Point
    end: Point

line = Line(Point(0, 0), Point(3, 4))

match line:
    case Line(start=Point(x=0, y=0), end=Point(x=ex, y=ey)):
        print('from origin to', ex, ey)

การผสมกับชนิดข้อมูลในตัว

ชนิดข้อมูลในตัวรองรับอาร์กิวเมนต์ตามตำแหน่งหนึ่งรายการเพื่อจับค่า int(n) จะจับคู่กับจำนวนเต็มและผูกค่านั้นไว้กับ n

def label(value):
    match value:
        case int(n):
            return 'int ' + str(n)
        case str(s):
            return 'str ' + s
        case _:
            return 'other'

print(label(7))
print(label('hi'))

ควรใช้รูปแบบคลาสเมื่อใด

เลือกใช้รูปแบบคลาสเมื่อทำงานกับอ็อบเจกต์ที่ทั้งชนิดและค่าแอตทริบิวต์มีผลต่อการทำงาน เช่น อ็อบเจกต์เหตุการณ์ โหนด AST หรือโครงสร้างลำดับชั้นของรูปทรง รูปแบบเหล่านี้ช่วยแทนการตรวจสอบ isinstance และการเข้าถึงแอตทริบิวต์ที่ยืดยาว

การผสมตามตำแหน่งและตามชื่อ

คุณสามารถผสมรูปแบบย่อยตามตำแหน่งและตามชื่อไว้ในรูปแบบคลาสเดียวได้เช่นเดียวกับการเรียกฟังก์ชัน รูปแบบตามตำแหน่งใช้ลำดับของ __match_args__ ส่วนรูปแบบตามชื่อจะระบุแอตทริบิวต์อย่างชัดเจน

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int
    z: int

p = Point(1, 2, 3)

match p:
    case Point(x, y, z=depth):
        print(x, y, depth)

ตรวจสอบความเข้าใจ

รูปแบบ Point(x=0, y=y) จับคู่กับอะไร

ทบทวน

คุณได้เรียนรู้การจับคู่กับแอตทริบิวต์ของอ็อบเจกต์

  • ClassName() ตรวจสอบชนิด
  • attr=name ผูกแอตทริบิวต์ ส่วนค่าลิเทอรัลจะกำหนดให้ค่าต้องตรงกันพอดี
  • __match_args__ เปิดใช้การจับคู่ตามตำแหน่ง
  • รูปแบบคลาสสามารถซ้อนกันและกระจายคำสั่งตามลำดับชั้นของชนิดได้

คำถามที่พบบ่อย

บทเรียน “รูปแบบคลาส” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบคลาส” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบคลาส”

จับคู่กับแอตทริบิวต์ของออบเจกต์ คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบคลาส” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน match และ case
  2. การจับคู่ลำดับและแมป
  3. รูปแบบคลาส
  4. การ์ดและไวลด์การ์ด
← กลับไปที่ Python Academy