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

แอตทริบิวต์ของอินสแตนซ์กับคลาส

แยกความแตกต่างระหว่างข้อมูลเฉพาะออบเจ็กต์กับข้อมูลที่ใช้ร่วมกันในระดับคลาส

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

บทนำ

การเข้าใจความแตกต่างระหว่างแอตทริบิวต์ของอินสแตนซ์กับแอตทริบิวต์ของคลาสช่วยป้องกันข้อผิดพลาดที่ตรวจพบได้ยาก และทำให้จัดการสถานะที่ใช้ร่วมกันได้อย่างมีประสิทธิภาพ

แอตทริบิวต์ของคลาส

class Dog: legs = 4 — legs ใช้ร่วมกันโดยทุกอินสแตนซ์ เข้าถึงได้ด้วย Dog.legs หรือ dog.legs
class Dog:
    legs = 4
print(Dog.legs)
print(Dog().legs)

แอตทริบิวต์ของอินสแตนซ์

self.name = name in __init__ เป็นแอตทริบิวต์เฉพาะของแต่ละอินสแตนซ์ Dog แต่ละตัวจึงมี name ของตนเอง
class Dog:
    def __init__(self, name):
        self.name = name
d1 = Dog('Rex')
d2 = Dog('Buddy')
print(d1.name, d2.name)

ลำดับการค้นหาแอตทริบิวต์

Python จะตรวจสอบ __dict__ ของอินสแตนซ์ก่อน จากนั้นจึงตรวจสอบ __dict__ ของคลาส และคลาสฐานตามลำดับ แอตทริบิวต์ของอินสแตนซ์จะบดบังแอตทริบิวต์ของคลาส
class C:
    x = 10
c = C()
c.x = 99  # instance shadows class attr
print(c.x)  # 99
print(C.x)  # 10

กับดักแอตทริบิวต์คลาสที่เปลี่ยนแปลงได้

class C: items = [] — อินสแตนซ์ทั้งหมดใช้รายการเดียวกัน การเพิ่มรายการในอินสแตนซ์หนึ่งจึงส่งผลต่อทุกอินสแตนซ์
class C:
    items = []
C.items.append(1)
print(C().items)  # [1] — shared!

การแก้กับดักวัตถุที่เปลี่ยนแปลงได้

ย้ายการเริ่มต้นไปไว้ใน __init__: def __init__(self): self.items = [] แต่ละอินสแตนซ์จะได้รับรายการของตนเอง
class C:
    def __init__(self):
        self.items = []
c1 = C(); c2 = C()
c1.items.append(1)
print(c1.items, c2.items)

การตรวจสอบ __dict__

obj.__dict__ คือพจนานุกรมแอตทริบิวต์ของอินสแตนซ์ ส่วน Class.__dict__ คือพจนานุกรมแอตทริบิวต์ของคลาส
class Dog:
    legs = 4
    def __init__(self, name): self.name = name
d = Dog('Rex')
print(d.__dict__)
print(Dog.__dict__.keys())

เมธอดคลาสในฐานะโรงงานสร้างออบเจ็กต์

@classmethod จะได้รับ cls ซึ่งหมายถึงคลาส แทนที่จะเป็น self ใช้เมธอดนี้เป็นตัวสร้างทางเลือก
class Date:
    def __init__(self, y, m, d): self.y,self.m,self.d=y,m,d
    @classmethod
    def from_string(cls, s):
        y,m,d=map(int,s.split('-'))
        return cls(y,m,d)
dt=Date.from_string('2024-01-15')
print(dt.y,dt.m,dt.d)

เมธอดสแตติก

@staticmethod ไม่มี self หรือ cls ใช้สำหรับฟังก์ชันอรรถประโยชน์ที่จัดกลุ่มตามตรรกะไว้กับคลาส แต่ไม่จำเป็นต้องใช้อินสแตนซ์หรือคลาส
class MathUtils:
    @staticmethod
    def add(a, b): return a + b
print(MathUtils.add(3, 4))

การติดตามอินสแตนซ์ด้วยแอตทริบิวต์ของคลาส

แอตทริบิวต์ของคลาสที่ทำหน้าที่เป็นตัวนับสามารถใช้ติดตามจำนวนอินสแตนซ์ที่ถูกสร้างขึ้น
class Widget:
    count = 0
    def __init__(self):
        Widget.count += 1
Widget(); Widget(); Widget()
print(Widget.count)

hasattr() และ vars()

hasattr(obj, 'name') ตรวจสอบว่ามีแอตทริบิวต์อยู่หรือไม่ ส่วน vars(obj) ให้ผลเทียบเท่ากับ obj.__dict__
class P:
    def __init__(self, x): self.x = x
p = P(5)
print(hasattr(p, 'x'), hasattr(p, 'z'))
print(vars(p))

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

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

ทบทวน

แอตทริบิวต์ของคลาสใช้ร่วมกัน ส่วนแอตทริบิวต์ของอินสแตนซ์เป็นของออบเจ็กต์แต่ละตัว การค้นหาแอตทริบิวต์ของอินสแตนซ์จะบดบังของคลาส ให้เริ่มต้นวัตถุที่เปลี่ยนแปลงได้ใน __init__ และใช้ @classmethod สำหรับเมธอดโรงงาน

เรียนต่อไป

ยอดเยี่ยมมาก! โปรดเรียนบทถัดไปต่อเพื่อพัฒนาทักษะของคุณให้ลึกซึ้งยิ่งขึ้น

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

บทเรียน “แอตทริบิวต์ของอินสแตนซ์กับคลาส” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “แอตทริบิวต์ของอินสแตนซ์กับคลาส”

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

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

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

บทเรียน “แอตทริบิวต์ของอินสแตนซ์กับคลาส” ใช้เวลานานแค่ไหน

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

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

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

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

  1. คลาสและเมธอด __init__
  2. แอตทริบิวต์ของอินสแตนซ์กับคลาส
  3. เมธอดของอินสแตนซ์และ self
  4. เมธอดพิเศษ: __str__ และ __repr__
← กลับไปที่ Python Academy