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

ไลบรารี attrs

เปรียบเทียบ attrs กับ dataclasses

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

attrs คืออะไร

attrs เป็นไลบรารีจากผู้พัฒนาภายนอกที่ริเริ่มแนวคิดการสร้างคลาสจากฟิลด์มาหลายปีก่อนที่ dataclasses จะเข้าสู่ไลบรารีมาตรฐาน โมดูล dataclasses มาตรฐานได้รับแรงบันดาลใจโดยตรงจากไลบรารีนี้

  • attrs ต้องติดตั้งแยกต่างหาก: pip install attrs
  • มีความสามารถมากกว่า dataclasses
  • dataclasses มีมาให้ในตัวและครอบคลุมความต้องการทั่วไปส่วนใหญ่

API สมัยใหม่ของ attrs

attrs สมัยใหม่ใช้ @define และ field() จากเนมสเปซ attrs โดยมีโครงสร้างคล้ายดาต้าคลาสมาก

from attrs import define, field

@define
class Point:
    x: int
    y: int

p = Point(1, 2)
print(p)

ใช้สล็อตเป็นค่าเริ่มต้น

ความแตกต่างที่สำคัญคือ คลาส @define จะใช้ __slots__ โดยอัตโนมัติ ช่วยลดการใช้หน่วยความจำและป้องกันการเพิ่มแอตทริบิวต์ที่ไม่ได้ประกาศโดยไม่ตั้งใจ ดาต้าคลาสทั่วไปจะใช้ __dict__ ตามปกติ เว้นแต่คุณจะส่ง slots=True (Python 3.10 ขึ้นไป)

ตัวตรวจสอบในตัว

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

from attrs import define, field
from attrs.validators import instance_of

@define
class User:
    age: int = field(validator=instance_of(int))

User(30)        # ok
User('oops')    # raises TypeError

ตัวแปลง

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

from attrs import define, field

@define
class Item:
    price: int = field(converter=int)

i = Item('42')   # stored as the integer 42
print(i.price)

สิ่งที่เทียบเท่าในดาต้าคลาส

แนวคิดเดียวกันนี้สามารถเขียนด้วยไลบรารีมาตรฐานได้ การตรวจสอบและการแปลงต้องเขียนด้วยตนเองใน __post_init__ เนื่องจากดาต้าคลาสไม่มีฮุกสำหรับแต่ละฟิลด์

from dataclasses import dataclass

@dataclass
class Item:
    price: int

    def __post_init__(self):
        self.price = int(self.price)

print(Item('42'))

asdict ในทั้งสองไลบรารี

ทั้งสองไลบรารีมีตัวช่วย asdict โดยตัวช่วยของดาต้าคลาสอยู่ใน dataclasses ส่วนของ attrs อยู่ใน attrs พฤติกรรมเกือบเหมือนกัน

from dataclasses import dataclass, asdict

@dataclass
class Point:
    x: int
    y: int

print(asdict(Point(1, 2)))

การทำให้ไม่เปลี่ยนแปลงใน attrs

attrs รองรับการทำให้ไม่เปลี่ยนแปลงเช่นกัน ให้ใช้ @frozen (ทางลัดของ @define(frozen=True)) สำหรับอินสแตนซ์ที่อ่านได้อย่างเดียว ซึ่งสอดคล้องกับ @dataclass(frozen=True)

from attrs import frozen

@frozen
class Point:
    x: int
    y: int

p = Point(1, 2)
print(p)
# p.x = 9  would raise FrozenInstanceError

การเปรียบเทียบความสามารถ

เปรียบเทียบกันได้ดังนี้:

  • dataclasses: ไลบรารีมาตรฐาน ไม่ต้องติดตั้ง และครอบคลุมความสามารถพื้นฐาน
  • attrs: มีตัวตรวจสอบ ตัวแปลง ใช้สล็อตเป็นค่าเริ่มต้น และกำหนดค่าได้มากกว่า
  • ทั้งสองไลบรารีสร้าง __init__, __repr__ และ __eq__ ให้

ควรเลือกใช้อะไร

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

รากฐานร่วมกัน

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

  • @define สอดคล้องกับ @dataclass
  • attrs.field สอดคล้องกับ dataclasses.field
  • เมื่อย้ายไปใช้ dataclasses ให้ย้ายตัวตรวจสอบไปไว้ใน __post_init__

ตรวจสอบอย่างรวดเร็ว

attrs มีความสามารถใดที่โมดูล dataclasses มาตรฐานไม่มีให้ในตัว

สรุปทบทวน

คุณได้เปรียบเทียบ attrs กับ dataclasses

  • attrs เป็นแรงบันดาลใจให้ dataclasses และมีความสามารถมากกว่า
  • attrs เพิ่มตัวตรวจสอบ ตัวแปลง และการใช้สล็อตเป็นค่าเริ่มต้น
  • dataclasses มีมาให้ในตัวและไม่ต้องติดตั้ง
  • เลือกเครื่องมือที่เรียบง่ายที่สุดและตรงกับความต้องการ

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

บทเรียน “ไลบรารี attrs” ฟรีหรือไม่

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

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

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

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

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

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

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

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

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

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

  1. การกำหนด Dataclass
  2. ค่าเริ่มต้นและ field()
  3. ตัวเลือกการตรึงและการเปรียบเทียบ
  4. ไลบรารี attrs
← กลับไปที่ Python Academy