ในโลกของการเขียนโปรแกรม การใช้งาน Function Decorators เป็นเทคนิคสำคัญที่ช่วยเพิ่มคุณภาพและการจัดการกับโค้ดให้ง่ายขึ้น ซึ่งเหมาะสำหรับนักพัฒนาทุกระดับความสามารถ วันนี้เราจะมาดู 5 Function Decorators สำหรับมือใหม่ที่ควรรู้ไว้ ที่จะช่วยให้การเขียนโปรแกรมของคุณมีประสิทธิภาพขึ้น
Decorator `@property` เป็นวิธีการนำ Object-Oriented Programming (OOP) ไปใช้ใน Python ที่ง่ายดาย ทำให้เราสามารถเข้าถึง method เหมือนกับเป็น attribute ของ object ได้
ตัวอย่างโค้ด:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value >= 0:
self._radius = value
else:
raise ValueError("Radius must be positive")
c = Circle(5)
print(c.radius) # 5
c.radius = 10
print(c.radius) # 10
โดยใช้ `@property` คุณสามารถกำหนด getter, setter และ deleter ให้กับ properties ได้อย่างง่ายดาย ทำให้การเขียนโปรแกรมเป็นไปอย่างปลอดภัยและคงรูปแบบ OOP ได้ดียิ่งขึ้น
เมื่อต้องการใช้ method ที่ไม่ต้องการใช้ข้อมูลใดๆ จาก instance หรือ class (`self` หรือ `cls`) `@staticmethod` เป็นตัวเลือกที่เหมาะสมที่ควรพิจารณา
ตัวอย่างโค้ด:
class Math:
@staticmethod
def add(x, y):
return x + y
sum = Math.add(1, 2)
print(sum) # 3
อย่างไรก็ตาม, ให้คิดว่า `@staticmethod` นั้นเหมาะกับฟังก์ชันที่มิได้เกี่ยวข้องโดยตรงกับคุณสมบัติของ class อันทำให้การใช้งานร่วมกันของโค้ดสะดวกยิ่งขึ้น
Decorator `@classmethod` ใช้สำหรับสร้าง method ที่ต้องการเข้าถึงตัวแปรของ class (`cls`) แทนที่จะเป็น instance ช่วยให้ง่ายต่อการสร้าง factory method หรือการ set up ทรัพยากรสำหรับ class
ตัวอย่างโค้ด:
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
@classmethod
def margherita(cls):
return cls(['mozzarella', 'tomatoes', 'basil'])
@classmethod
def prosciutto(cls):
return cls(['mozzarella', 'tomatoes', 'ham'])
pizza = Pizza.margherita()
print(pizza.ingredients) # ['mozzarella', 'tomatoes', 'basil']
`@classmethod` ทำให้การจัดการกับ class variables และ factory methods ที่เกี่ยวข้องกับ class นั้นง่ายที่สุด
การใช้ `@lru_cache` จากโมดูล `functools` เพื่อเก็บ cache ของผลลัพธ์ของ 함수 ช่วยให้เราประหยัดเวลาได้มากเมื่อจำเป็นต้องเรียกฟังก์ชันเดิมด้วย arguments ที่เดิมอยู่บ่อยครั้ง
ตัวอย่างโค้ด:
from functools import lru_cache
@lru_cache()
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(10)) # 55
การเพิ่ม `@lru_cache` ทำให้การคำนวณฟังก์ชันที่ซับซ้อนอย่าง fibonacci ทำได้เร็วขึ้นมาก ลดการคำนวณซ้ำลงอย่างมีประสิทธิภาพ
ในกรณีที่คุณใช้ inner functions หรือ decorators ของตนเอง `@wraps` จากโมดูล `functools` จะช่วยรักษา metadata ของ original function ไม่ให้หายไป
ตัวอย่างโค้ด:
from functools import wraps
def decorator(f):
@wraps(f)
def wrapped(*args, **kwargs):
print('Calling decorated function')
return f(*args, **kwargs)
return wrapped
@decorator
def function():
"""Docstring for function."""
print('Calling original function')
function()
การใช้ `@wraps` ช่วยทำให้นักพัฒนาที่อาจต้องการดูคำอธิบายของ function หรือ metadata อื่นๆ สามารถเข้าถึงได้ไม่เปลี่ยนแปลง แม้ว่า function นั้นจะถูก decorate ไปแล้ว
การใช้ function decorators ในโค้ดของคุณเป็นวิธีที่ง่ายและมีประสิทธิภาพในการปรับปรุง functionality ของ functions และ maintaining โค้ดของคุณให้คงรูบแบบ ถูกต้อง และอ่านง่ายมากขึ้น ดั้งนั้น ไม่ว่าคุณจะเป็นมือใหม่หรือนักพัฒนาที่มีประสบการณ์ decorators เหล่านี้จะช่วยให้คุณสร้างโปรแกรมที่ทั้งแกร่งและสะดวกในการใช้งาน
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
Tag ที่น่าสนใจ: function_decorators python programming_techniques oop property staticmethod classmethod lru_cache wraps functools decorators
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com