ไลบรารี 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สอดคล้องกับ@dataclassattrs.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ