Python: classmethod vs staticmethod ต่างกันยังไง

Grassroot Engineer
2 min readJan 26, 2025

--

https://www.youtube.com/watch?v=SXApHXsDe8I

ใน Python, decorator อย่าง @staticmethod และ @classmethod มีบทบาทสำคัญในการกำหนด method ภายในคลาสที่สามารถทำงานได้อย่างอิสระจาก instance หรือให้ฟังก์ชันทำงานที่เฉพาะเจาะจงกับตัวคลาส (ยังงงๆสินะ) เด่วบทความนี้จะอธิบาย + แสดงตัวอย่าง และกรณีการใช้งานใน Python และ Django

ถ้าอยากรู้ว่า decorator คืออะไร ไปดูได้ที่นี่เลย Link

Summary:

  1. @staticmethod: method ที่ไม่มี self เพราะไม่ต้องการ class แค่จัดเข้ามาเพื่อให้เป็น structure (เรียกใช้จากชื่อคลาสได้เลย ไม่จำเป็นต้องสร้าง instance)

2. @classmethod: method ที่มี cls เป็น param แรก สามารถจัดการ get, set values ของ attributes ได้ (จัดการ data ภายใน class ได้)

ทั้ง staticmethod และ classmethod เวลาใช้งานสามารถเรียกผ่านชื่อ class ได้โดยตรงเลย ต่างกันที่ staticmethod จะเป็น function ทั่วๆไป, ส่วน classmethod จะเป็น method ที่เกี่ยวกับ class โดยสามารถ get, set values ภายใน class ได้หมดจ้า

@staticmethod คืออะไร?

@staticmethod เป็น method ที่ไม่จำเป็นต้องเข้าถึงตัวคลาส (cls) หรือ instance (self) method นี้ทำงานเหมือนฟังก์ชันปกติแต่ถูกจัดกลุ่มอยู่ภายในคลาสที่มันสังกัด Static methods มีประโยชน์สำหรับฟังก์ชันที่เกี่ยวข้องกับคลาสแต่ไม่ต้องการข้อมูลจากตัวคลาสหรือ instance

คุณสมบัติของ @staticmethod

  • ไม่รับ self หรือ cls เป็นพารามิเตอร์แรก
  • สามารถเรียกใช้งานได้โดยตรงจาก class หรือ instance
  • เหมาะสำหรับเมธอดที่ใช้ในงานทั่วไปที่เกี่ยวข้องกับคลาส
    พูดง่ายๆว่า ใช้ผ่านชื่อคลาสได้เลย จิงๆ method นี้ไม่ได้ต้องการอะไรจากคลาส แค่วางไว้ในคลาส เพือให้ดูเป็น structure เท่านั้นเอง

ตัวอย่างการใช้งาน @staticmethod ใน Python

class MathUtils:
@staticmethod
def add_numbers(a, b):
return a + b
# วิธีเรียกใช้งาน static methodresult = MathUtils.add_numbers(10, 20)
print(result) # Output: 30

ในตัวอย่างนี้ add_numbers เป็น static method เนื่องจากมันไม่พึ่งพาข้อมูลใดๆ จาก MathUtils หรือ instance ของคลาส

Used case in Django

@classmethod คืออะไร?

@classmethod เป็นเมธอดที่รับคลาส (cls) เป็นพารามิเตอร์แรก เมธอดนี้มีประโยชน์เมื่อต้องการทำงานกับ attribute หรือเมธอดของคลาส และสามารถเปลี่ยนแปลงสถานะของคลาสที่มีผลต่อ instance ทั้งหมดได้

คุณสมบัติของ @classmethod

  • รับ cls (ตัวคลาสเอง) เป็นพารามิเตอร์แรก
  • ใช้สร้าง factory methods หรือเปลี่ยนแปลง attribute ระดับคลาสได้
  • สามารถเรียกใช้งานได้จากทั้งคลาสหรือ instance

ตัวอย่างการใช้งาน @classmethod ใน Python

class MyClass:
name = "Default Name"
    @classmethod
def set_name(cls, new_name):
cls.name = new_name
@classmethod
def get_name(cls):
return cls.name
# เรียกใช้งาน class methods
print(MyClass.get_name()) # Output: Default Name
MyClass.set_name("New Name")
print(MyClass.get_name()) # Output: New Name

ในตัวอย่างนี้ set_name และ get_name เป็น class methods ที่ทำงานกับ attribute ของคลาสชื่อ name

Compare normal OOP vs apply to use staticmethod and classmethod

สรุป

  • @classmethod: เหมาะสำหรับการทำงานที่ต้องอ้างอิงคลาส เช่น Factory Method หรือ Custom Query
  • @staticmethod: เหมาะสำหรับฟังก์ชันทั่วไปที่ไม่ได้อ้างอิงถึงคลาสหรือ instance เช่น Utility Function หรือ Validation Logic

ใน Django การใช้ @classmethod และ @staticmethod ช่วยให้โค้ดสะอาด เข้าใจง่าย และแยกความรับผิดชอบได้ชัดเจน เหมาะสำหรับการออกแบบโครงสร้างโปรเจกต์ที่ดี! 🚀

--

--

Grassroot Engineer
Grassroot Engineer

Written by Grassroot Engineer

ATM engineer who is interested in CODING and believe in EFFORT. — https://grassrootengineer.com

No responses yet