Python: classmethod vs staticmethod ต่างกันยังไง
ใน Python, decorator อย่าง @staticmethod
และ @classmethod
มีบทบาทสำคัญในการกำหนด method ภายในคลาสที่สามารถทำงานได้อย่างอิสระจาก instance หรือให้ฟังก์ชันทำงานที่เฉพาะเจาะจงกับตัวคลาส (ยังงงๆสินะ) เด่วบทความนี้จะอธิบาย + แสดงตัวอย่าง และกรณีการใช้งานใน Python และ Django
ถ้าอยากรู้ว่า decorator คืออะไร ไปดูได้ที่นี่เลย Link
Summary:
@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 ของคลาส
@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 NameMyClass.set_name("New Name")
print(MyClass.get_name()) # Output: New Name
ในตัวอย่างนี้ set_name
และ get_name
เป็น class methods ที่ทำงานกับ attribute ของคลาสชื่อ name
สรุป
@classmethod
: เหมาะสำหรับการทำงานที่ต้องอ้างอิงคลาส เช่น Factory Method หรือ Custom Query@staticmethod
: เหมาะสำหรับฟังก์ชันทั่วไปที่ไม่ได้อ้างอิงถึงคลาสหรือ instance เช่น Utility Function หรือ Validation Logic
ใน Django การใช้ @classmethod
และ @staticmethod
ช่วยให้โค้ดสะอาด เข้าใจง่าย และแยกความรับผิดชอบได้ชัดเจน เหมาะสำหรับการออกแบบโครงสร้างโปรเจกต์ที่ดี! 🚀
Ref:
https://www.facebook.com/photo?fbid=1048175914003293&set=pcb.2462929277377460
https://chatgpt.com/g/g-GGVMZgsnh-django-mentor/c/678d44ee-6584-8002-862b-fd482c07a326