از هر یک از ساختارهای بالا چ زمانی استفاده میکنیم
سلام، 1. @staticmethod:
زمانی از این decorater استفاده میکنیم که میخواهیم یک تابع را به عنوان یک تابع استاتیک تعریف کنیم. توابع استاتیک به کلاس تعلق دارند، اما نیازی به نمونهای از کلاس برای اجرا ندارند. از این decorater برای توابعی که فقط به پارامترهای خود و نه به ویژگیهای کلاس نیاز دارند استفاده میشود. مثال:
class MyClass:
@staticmethod
def my_static_method(x, y):
return x + y
# بدون نیاز به ایجاد نمونه از کلاس میتوان از تابع استفاده کرد
MyClass.my_static_method(1, 2)
2. @property:
از این decorater برای تبدیل یک تابع به یک property استفاده میشود. propertyها مانند ویژگیهای کلاس عمل میکنند، اما میتوانند منطق پیچیدهتری برای محاسبه مقدار خود داشته باشند. مثال:
class MyClass:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
my_instance = MyClass("John")
# میتوان از property مانند یک ویژگی ساده استفاده کرد
print(my_instance.name) # John
my_instance.name = "Mary"
print(my_instance.name) # Mary
3. @abstractmethod:
از این decorater برای تعریف یک متد انتزاعی در یک کلاس پایه استفاده میشود. متدهای انتزاعی بدنهای ندارند و باید در کلاسهای مشتق شده پیادهسازی شوند. مثال:
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
print("Woof!")
class Cat(Animal):
def speak(self):
print("Meow!")
# ایجاد نمونه از کلاس پایه غیرممکن است
# animal = Animal()
dog = Dog()
dog.speak() # Woof!
cat = Cat()
cat.speak() # Meow!
4. @classmethod:
از این decorater برای تعریف یک متد کلاس استفاده میشود. متدهای کلاس به طور مستقیم روی کلاس و نه روی نمونههای آن اجرا میشوند. از این decorater برای متدهایی که به ویژگیهای کلاس یا ایجاد نمونههای جدید از کلاس نیاز دارند استفاده میشود. مثال:
class MyClass:
@classmethod
def create_instance(cls, name):
return cls(name)
my_instance = MyClass.create_instance("John")
print(my_instance.name) # John