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

@classmethod และ @staticmethod

กำหนดเมธอดระดับคลาสและเมธอดสแตติกด้วยเดคอเรเตอร์ที่เหมาะสม

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

บทนำ

@classmethod ได้รับคลาสเป็นอาร์กิวเมนต์แรก ส่วน @staticmethod ไม่ได้รับอาร์กิวเมนต์พิเศษใด ๆ ทั้งสองอย่างกำหนดไว้ภายในคลาส

อินสแตนซ์กับคลาสกับสแตติก

เมธอดปกติจะได้รับ self เมธอดคลาสจะได้รับ cls ส่วนเมธอดสแตติกจะไม่ได้รับทั้งสองอย่าง ให้เลือกตามข้อมูลที่ต้องใช้
class Demo:
    def instance(self): return 'instance'
    @classmethod
    def class_m(cls): return f'class: {cls.__name__}'
    @staticmethod
    def static_m(): return 'static'
d = Demo()
print(d.instance())
print(Demo.class_m())
print(Demo.static_m())

@classmethod ในฐานะโรงงาน

การใช้งานที่พบบ่อยที่สุดคือคอนสตรัคเตอร์ทางเลือก เช่น Date.from_string('2024-01-15') แทนการแยกวิเคราะห์ข้อมูลใน __init__
class Date:
    def __init__(self, y,m,d): self.y,self.m,self.d=y,m,d
    @classmethod
    def today(cls):
        from datetime import date
        d = date.today()
        return cls(d.year, d.month, d.day)
    def __repr__(self): return f'{self.y}-{self.m}-{self.d}'
print(Date.today())

@classmethod กับการสืบทอด

cls ใน classmethod จะอ้างถึงคลาสย่อยที่ใช้งานจริง ไม่ใช่คลาสฐาน ทำให้เมธอดโรงงานทำงานกับคลาสย่อยได้อย่างถูกต้อง
class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name): self.name = name
class Dog(Animal): pass
d = Dog.create('Rex')
print(type(d).__name__, d.name)

@staticmethod สำหรับยูทิลิตี

เมธอดสแตติกคือฟังก์ชันปกติที่จัดกลุ่มเชิงตรรกะไว้กับคลาส โดยไม่สามารถเข้าถึงข้อมูลของคลาสหรืออินสแตนซ์ได้
class MathHelper:
    @staticmethod
    def clamp(value, lo, hi):
        return max(lo, min(hi, value))
print(MathHelper.clamp(15, 0, 10))
print(MathHelper.clamp(-5, 0, 10))

@staticmethod กับฟังก์ชันระดับโมดูล

หากฟังก์ชันไม่จำเป็นต้องใช้คลาส ฟังก์ชันนั้นอาจเป็นฟังก์ชันระดับโมดูลได้ ให้ใช้ @staticmethod เฉพาะเมื่อฟังก์ชันนั้นมีความเกี่ยวข้องเชิงตรรกะกับคลาส
class Validator:
    @staticmethod
    def is_email(s): return '@' in s and '.' in s
print(Validator.is_email('user@example.com'))
print(Validator.is_email('not-an-email'))

การเรียกใช้จากอินสแตนซ์

คุณสามารถเรียกใช้ทั้ง @classmethod และ @staticmethod จากอินสแตนซ์ได้ แต่พฤติกรรมของ cls และการไม่มีอาร์กิวเมนต์แรกจะไม่เปลี่ยนแปลง
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

เมธอดคลาสสำหรับ Singleton

classmethod สามารถบังคับใช้รูปแบบ Singleton ได้โดยตรวจสอบว่ามีอินสแตนซ์อยู่แล้วหรือไม่
class Singleton:
    _instance = None
    @classmethod
    def get(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
a = Singleton.get()
b = Singleton.get()
print(a is b)

การเขียนทับ Classmethod

คลาสย่อยสามารถเขียนทับ classmethod ได้ จากนั้น cls จะเป็นคลาสย่อย ทำให้ยังคงรองรับพหุสัณฐาน
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

การตรวจสอบชนิดด้วย cls

ภายใน classmethod cls คือคลาสที่ใช้งานจริง ใช้ cls() เพื่อสร้างอินสแตนซ์ และอย่าระบุชื่อคลาสแบบตายตัว
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

การใช้ร่วมกับ @property

ค่าที่แคชไว้ในระดับคลาสสามารถใช้ @classmethod ร่วมกับแอตทริบิวต์ของคลาส เพื่อแคชข้อมูลที่ใช้ร่วมกันทั้งคลาสได้
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

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

cls ใน @classmethod คืออะไร

ทบทวน

@classmethod ได้รับ cls จึงเหมาะสำหรับโรงงาน คอนสตรัคเตอร์ทางเลือก และ Singleton ส่วน @staticmethod ไม่ได้รับอาร์กิวเมนต์พิเศษ จึงเหมาะสำหรับยูทิลิตี โดย cls คือคลาสจริงหรือคลาสย่อยที่ใช้งาน

เรียนรู้ต่อไป

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

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

บทเรียน “@classmethod และ @staticmethod” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “@classmethod และ @staticmethod”

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

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

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

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

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

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

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

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

  1. ฟังก์ชันในฐานะออบเจ็กต์ชั้นหนึ่ง
  2. การเขียนเดคอเรเตอร์แบบกำหนดเอง
  3. เดคอเรเตอร์ @property
  4. @classmethod และ @staticmethod
← กลับไปที่ Python Academy