การเขียนโปรแกรมนั้นหลายครั้งไม่ได้อยู่แค่เรื่องของการทำให้โค้ดทำงานได้ตามที่ต้องการเท่านั้น แต่ยังรวมไปถึงการเขียนโค้ดให้มีความสะอาด, อ่านง่าย, และเป็นมิตรกับนักพัฒนาคนอื่นๆ ด้วย Python decorators คือหนึ่งในเครื่องมือที่ช่วยให้เราสามารถทำได้สิ่งเหล่านี้ได้อย่างง่ายดาย ลองมาดู 5 decorators ที่จะยกระดับโค้ดของคุณได้จากระดับหนึ่งไปยังอีกขั้น
#### 1. `@property`
Decorator แรกที่จะพูดถึงคือ `@property` ซึ่งเป็นวิธีการทำ encapsulation ใน Python ที่ช่วยให้เราสามารถควบคุมการเข้าถึงข้อมูลของ 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 cannot be negative")
ในตัวอย่างข้างต้น เรามี `@property` ที่ช่วยให้เราดึงค่า radius ออกมาได้ และ `@radius.setter` ที่กำหนดค่าให้กับ radius พร้อมกับตรวจสอบค่า negativ
#### 2. `@staticmethod` และ `@classmethod`
Python มี decorators สองตัวที่ช่วยให้เราสามารถสร้าง methods ที่เกี่ยวข้องกับ class และไม่จำเป็นต้องใช้ instance เป็นตัวแปร
class Calculator:
@staticmethod
def add(x, y):
return x + y
@classmethod
def subtract(cls, x, y):
return x - y
`@staticmethod` ใช้สำหรับ method ที่ไม่ต้องการ self หรือ cls เป็น parameter ในขณะที่ `@classmethod` เปิดโอกาสให้เราเข้าถึงคลาสแอตทริบิวต์ได้ในตัวเมธอด
#### 3. `@lru_cache`
หากคุณเคยต้องต่อสู้กับปัญหา performance อย่างเช่นการคำนวณฟังก์ชันที่มีราคาแพงหลายครั้ง `@lru_cache` สามารถช่วยเหลือคุณได้ โดยมันเป็นการ cache ผลลัพธ์ของฟังก์ชันถ้ามันเรียกด้วย argument เดียวกัน
from functools import lru_cache
@lru_cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
Decorator นี้จะช่วยลดเวลาในการคำนวณเพราะทำให้ฟังก์ชันไม่ต้องคำนวณซ้ำๆ เมื่อมีการเรียกใช้กับค่าเดิม
#### 4. `@singledispatch`
Python เป็นภาษาที่มี dynamic typing, เรื่องนี้ทำให้บางครั้งเราอยากให้ฟังก์ชันทำงานแตกต่างขึ้นอยู่กับประเภทของอาร์กิวเมนต์ที่ส่งผ่านเข้าไป `@singledispatch` ช่วยให้เราทำ multiline dispatch
from functools import singledispatch
@singledispatch
def format(arg):
return arg
@format.register
def _(arg: int):
return f'Integer number: {arg}'
@format.register
def _(arg: float):
return f'Float number: {arg:.2f}'
@format.register(list)
def _(arg):
return "List of " + ", ".join(map(str, arg))
ตรงนี้เราสร้างฟังก์ชัน `format` ที่มีการใช้งานที่แตกต่างกันไปตามประเภทของอาร์กิวเมนต์ที่ส่งเข้ามา
#### 5. `@dataclass`
ก่อน Python 3.7, การสร้าง classes ที่เพียงแต่ถือ data นั้นส่วนใหญ่จะต้องเขียนซ้ำๆ สำหรับโค้ดส่วน boilerplate `@dataclass` มาช่วยให้เราไม่ต้องเสียเวลาเขียนโค้ดที่ซ้ำซากนั้นอีกต่อไป
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
ด้วย `@dataclass`, Python ช่วยสร้าง `__init__`, `__repr__`, `__eq__`, และอื่นๆ ให้เราโดยอัตโนมัติ
Decorators เหล่านี้เป็นแค่จุดเริ่มต้นเท่านั้น แต่พวกมันสามารถช่วยให้คุณรักษาระดับและคุณภาพของโค้ดได้ เมื่อคุณได้เรียนรู้วิธีการใช้งานอย่างถูกต้องแล้วนั่นเอง และสำหรับคุณที่สนใจในการเขียนโปรแกรม Python ระดับต่อไป, คุ้มค่าที่จะเรียนรู้และเอาชนะท้าทายเหล่านี้ในลักษณะนั้น
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ decorators หรือการเขียนโปรแกรม Python ในแบบศึกษาวิจัยหรือโปรเจกต์จริง, การเรียนรู้ที่สถาบันฝึกอบรมที่เชี่ยวชาญอย่าง EPT เป็นช่องทางที่ดีที่จะช่วยให้คุณก้าวไปอีกขั้นในด้านการเขียนโค้ดและพัฒนาแอปพลิเคชัน นอกจากนี้ยังมีโอกาสพบปะกับผู้ที่สนใจด้านเดียวกันเพื่อแลกเปลี่ยนความคิดและประสบการณ์ในวงการโปรแกรมมิ่งอีกด้วย
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM