آموزش classmethod در پایتون به زبان ساده + مثال عملی
پایتون نوعی زبان برنامهنویسی شی گرا (OOP) قدرتمند است که ابزارها و تکنیکهای مختلفی را برای نوشتن کدهای تمیز و کارآمد ارائه میدهد. یکی از این ابزارها دکوراتور کلاس متد (Classmethod) است که به ما امکان میدهد متدهایی را تعریف کنیم که در سطح کلاس تا سطح نمونه قابلدسترسی باشند. در این مطلب از مجله مکتب خونه به بررسی Classmethod در پایتون میپردازیم و کاربردها، مزایا و مثالهای کاربردی آن را بررسی میکنیم.
Classmethod در پایتون چیست؟
Classmethod در پایتون نوع خاصی از متد محسوب میشود که به کلاس محدود شده است و نه نمونه کلاس. این متد با استفاده از دکوراتور @classmethod تعریف میشود و معمولاً بالای تعریف متد قرار میگیرد. سینتکس Classmethod در پایتون به صورت زیر است:
class MyClass:
@classmethod
def my_classmethod(cls, arg1, arg2, ...):
# method implementation
دکوراتور @classmethod برای نشان دادن اینکه متد، زیر متد کلاسی است استفاده میشود و باید به خود کلاس متصل شود نه نمونهای از کلاس. اولین پارامتر متد کلاس به طور معمول cls نامیده میشود که به خود کلاس اشاره دارد. این به متد کلاس اجازه میدهد تا به ویژگیها و متدهای سطح کلاس دسترسی داشته باشد و آنها را دستکاری کند. در متد کلاس، میتوانیم از cls برای ارجاع به کلاس و ویژگیها یا متدهای آن استفاده کنیم. همچنین میتوانیم هر پارامتر اضافی را در صورت نیاز به متد کلاس ارسال کنیم.
برای فراخوانی متد کلاس، میتوانیم از نام کلاس و به دنبال آن نام متد، بدون ایجاد نمونهای از کلاس استفاده کنیم. مثال زیر این موضوع را بیان میکند:
MyClass.my_classmethod(arg1, arg2, ...)
کاربرد classmethod در پایتون
Classmethod در پایتون کاربردها و مزایای زیادی در کدنویسی ارائه میدهد که از جمله مهمترین آنها در ادامه ذکر شدهاند.
پیشنهاد مطالعه: شناخت بهترین کتابخانه های پایتون
دسترسی به ویژگیهای سطح کلاس
یکی از مزایای اصلی استفاده از متد کلاس این است که به ما امکان میدهد به ویژگیهای سطح کلاس دسترسی داشته باشیم و آنها را دستکاری کنیم. ویژگیهای سطح کلاس توسط همه نمونههای یک کلاس به اشتراک گذاشته میشوند و اصلاح آنها با استفاده از متد کلاس بر همه نمونههای آن کلاس تأثیر میگذارد. این میتواند در سناریوهایی که میخواهیم اطلاعات مربوط به کل کلاس را بهروز یا بازیابی کنیم، مفید باشد.
ارائه سازنده های جایگزین
یکی دیگر از استفادههای رایج از Classmethod در پایتون، ارائه سازندگان جایگزین برای یک کلاس است. برای مثال، ممکن است بخواهیم نمونههایی از یک کلاس را با استفاده از فرمتهای ورودی مختلف یا از منابع داده خارجی ایجاد کنیم. با استفاده از متد کلاس، میتوانیم سازندههای جایگزینی را تعریف کنیم که میتوانند پارامترهای ورودی مختلف و نمونههایی از کلاس را برگردانند. این میتواند به بهبود انعطافپذیری و قابلیت استفاده کد ما کمک کند.
پیاده سازی عملیات در سطح کلاس
classmethod همچنین میتواند برای اجرای عملیات مرتبط در سطح کلاس استفاده شود. برای مثال، میتوانیم یک متد کلاس برای انجام عملیات سطح کلاس مانند مرتبسازی نمونههای کلاس یا انجام بهروزرسانی دستهای در همه نمونهها تعریف کنیم. این میتواند کد ما را ساده کرده و آن را سازماندهی کند.
مثال هایی از classmethod در پایتون
در این بخش از مطلب چند مثال عملی از classmethod در پایتون ارائه خواهد شد تا کاربران بهتر این موضوع را در پایتون درک کنند.
مثال 1: پیادهسازی شمارنده در سطح کلاس
class MyClass:
counter = 0
def __init__(self):
MyClass.counter += 1
@classmethod
def get_instance_count(cls):
return cls.counter
# Usage
obj1 = MyClass()
obj2 = MyClass()
print(MyClass.get_instance_count()) # Output: 2
خروجی مثال بالا Classmethod در پایتون به صورت زیر است:
در مثال فوق، یک ویژگی شمارنده در سطح کلاس تعریف میکنیم و از متد کلاس get_instance_count() برای دسترسی و برگرداندن مقدار شمارنده استفاده خواهیم کرد. هر بار که یک نمونه از MyClass ایجاد میشود، شمارنده افزایش مییابد. با استفاده از متد کلاس، میتوانیم به ویژگی counter در سطح کلاس دسترسی داشته باشیم و آن را دستکاری کنیم.
پیشنهاد مطالعه: آموزش نوشتن بازی حدس اعداد در پایتون + سورس بازی
مثال 2: پیادهسازی سازندههای جایگزین
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
@classmethod
def from_json(cls, json_str):
data = json.loads(json_str)
return cls(data['name'], data['age'])
# Usage
json_str = '{"name": "kami", "age": 28}'
person = Person.from_json(json_str)
print(person)
خروجی مثال فوق به صورت زیر است:
در مثال فوق، یک کلاس Person با متد __init__ تعریف میکنیم که نام و سن را به عنوان پارامتر در نظر میگیرد. ما همچنین یک متد __repr__ را برای ارائه یک نمایش رشتهای از اشیاء Person تعریف میکنیم. علاوه بر این، یک متد کلاس from_json تعریف خواهیم کرد که رشته JSON را به عنوان ورودی میگیرد، آن را تجزیه کرده و شی (Object) Person از دادههای استخراج شده ایجاد میکند. این به ما امکان میدهد نمونههای Person را از دادههای JSON با استفاده از متد کلاس from_json ایجاد کرده و یک سازنده جایگزین برای ایجاد اشیا ارائه کنیم.
مثال 3: اجرای عملیات در سطح کلاس
class Circle:
pi = 3.14159
def __init__(self, radius):
self.radius = radius
def area(self):
return Circle.pi * self.radius ** 2
@classmethod
def change_pi(cls, new_pi):
cls.pi = new_pi
# Usage
circle1 = Circle(5)
print(circle1.area()) # Output: 78.53975
Circle.change_pi(3.14) # Changing the value of pi at the class level
circle2 = Circle(3)
print(circle2.area()) # Output: 28.26
خروجی این مثال Classmethod در پایتون به صورت زیر است:
در مثال فوق، یک کلاس Circle را با ویژگی pi و یک متد area تعریف میکنیم که مساحت دایره را بر اساس شعاع آن محاسبه میکند. ما همچنین یک متد کلاس change_pi را تعریف میکنیم که به ما امکان میدهد مقدار pi را در سطح کلاس بهروز کنیم. این نشان میدهد که چگونه میتوانیم از Classmethod در پایتون برای پیادهسازی عملیات سطح کلاس استفاده کنیم که بر همه نمونههای کلاس تأثیر میگذارد.
مثالی کاربردی از Classmethod در پایتون
در این بخش یک مثال واقعی پایتون (Real Python Example) بررسی خواهد شد. بیایید نمونهای از کلاس BankAccount را در نظر بگیریم که نمایانگر حسابهای بانکی است. ما از متد Classmethod در پایتون برای پیگیری تعداد کل حسابهای بانکی ایجاد شده و ارائه یک شماره حساب منحصربهفرد برای هر حساب استفاده میکنیم.
class BankAccount:
total_accounts = 0
def __init__(self, owner, balance):
self.owner = owner
self.balance = balance
BankAccount.total_accounts += 1
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
if self.balance >= amount:
self.balance -= amount
else:
print("Insufficient balance")
def get_balance(self):
return self.balance
@classmethod
def get_total_accounts(cls):
return cls.total_accounts
@classmethod
def create_account(cls, owner, balance):
return cls(owner, balance)
# Usage
account1 = BankAccount("John", 1000)
account2 = BankAccount("Jane", 5000)
print(BankAccount.get_total_accounts()) # Output: 2
account3 = BankAccount.create_account("Alice", 2000)
print(BankAccount.get_total_accounts()) # Output: 3
خروجی به صورت زیر است:
در این مثال، یک کلاس BankAccount با متد __init__ برای مقداردهی اولیه مالک و موجودی حساب تعریف میکنیم. همچنین متدهایی را برای واریز، برداشت و دریافت موجودی حساب تعریف خواهیم کرد.
ما از متغیر کلاس total_accounts برای پیگیری تعداد کل حسابهای بانکی ایجاد شده استفاده میکنیم. در متد __init__، هر بار که یک حساب کاربری جدید ایجاد میشود، متغیر کلاس total_accounts را 1 افزایش میدهیم.
سپس یک متد کلاس get_total_accounts تعریف میکنیم که تعداد کل حسابهای بانکی ایجاد شده را برمیگرداند. این متد کلاس را میتوان همانطور که در مثال نشان داده شده روی خود کلاس فراخوانی کرد و مقدار فعلی متغیر کلاس total_accounts را برمیگرداند.
ما همچنین یک متد کلاس create_account را تعریف میکنیم که سازنده جایگزینی برای ایجاد نمونههای BankAccount جدید ارائه میدهد. این متد کلاس مالک و موجودی حساب را به عنوان پارامتر در نظر میگیرد و با استفاده از پارامتر cls که به خود کلاس اشاره دارد یک شی BankAccount جدید ایجاد میکند. این به ما امکان میدهد بدون تماس صریح سازنده BankAccount، حسابهای جدید ایجاد کنیم، و راه راحتتری برای ایجاد حسابها ارائه میدهد.
با استفاده از Classmethod در پایتون برای مثال فوق، ما میتوانیم تعداد کل حسابهای ایجاد شده در سطح کلاس را ردیابی کنیم و یک سازنده جایگزین مناسب برای ایجاد حسابهای جدید ارائه دهیم که کد ما را سازماندهیتر و کارآمدتر میکند.
پیشنهاد مطالعه: آموزش تکرار شونده ها در پایتون (iterators)
staticmethod در پایتون
staticmethod نوع دیگری از متد در پایتون محسوب میشود که مربوط به classmethod است. در حالی که هم staticmethod و هم classmethod برای تعریف متدهایی استفاده میشوند که به یک کلاس تعلق دارند تا نمونهای از کلاس، آنها در نحوه اتصال و دسترسی متفاوت هستند.
برخلاف classmethod در پایتون که خود کلاس را به عنوان اولین پارامتر (cls) دریافت میکند، staticmethod هیچ پارامتر اول خاصی را دریافت نمیکند. در عوض، این به سادگی یک تابع منظم است که در یک کلاس تعریف میشود و میتواند در خود کلاس فراخوانی شود، بدون اینکه نمونهای از کلاس ایجاد شود. در اینجا سینتکس تعریف متد استاتیک در پایتون آمده است.
class MyClass:
@staticmethod
def my_staticmethod(arg1, arg2, ...):
# method implementation
متد static به ویژگیهای نمونه یا سطح کلاس دسترسی ندارد، زیرا هیچ پارامتر اول خاصی مانند cls یا self را دریافت نمیکند. در واقع Static Method مانند تابع معمولی که خارج از کلاس تعریف شده است رفتار میکند، با این تفاوت که در فضای نام کلاس کپسوله شده است.
یکی از موارد استفاده اصلی برای staticmethod زمانی است که ما یک متد کاربردی داریم که به وضعیت نمونه یا کلاس بستگی ندارد و میخواهیم آن را بدون ایجاد نمونه روی خود کلاس فراخوانی کنیم. این میتواند برای متدهایی مفید باشد که محاسبات رایج را انجام میدهند یا عملکرد ابزاری را ارائه میکنند که نیازی به دسترسی به دادههای خاص نمونه یا سطح کلاس ندارند.
پیشنهاد مطالعه: کتابخانه های پایتون + مزایا، معایب و کاربرد هرکدام
مثال staticmethod در پایتون
در اینجا یک مثال برای نشان دادن استفاده از روش static در مقایسه با کلاس متد آورده شده است:
class MathUtils:
@staticmethod
def square(n):
return n * n
@classmethod
def cube(cls, n):
return n * n * n
# Usage
print(MathUtils.square(5)) # Output: 25
print(MathUtils.cube(5)) # Output: 125
خروجی این مثال به صورت زیر است:
در مثال فوق، ما یک کلاس MathUtils را با مربع staticmethod و یک مکعب classmethod تعریف میکنیم. متد مربع به حالت نمونه یا کلاس بستگی ندارد، بنابراین میتوان آن را به عنوان یک متد استاتیک static تعریف کرد. همانطور که در مثال نشان داده شده است، میتوان آن را در خود کلاس فراخوانی کرد.
از طرف دیگر، متد مکعب نیاز به دسترسی به دادههای سطح کلاس (cls) دارد، بنابراین به عنوان یک متد کلاس تعریف میشود. میتوان آن را روی خود کلاس یا نمونهای از کلاس فراخوانی کرد و کلاس را به عنوان اولین پارامتر (cls) به طور خودکار دریافت میکند و به آن اجازه میدهد به دادههای سطح کلاس دسترسی داشته باشد و آنها را دستکاری کند.
به طور خلاصه، staticmethod و classmethod در پایتون هر دو برای تعریف متدهایی استفاده میشوند که به یک کلاس تعلق دارند تا یک نمونه، اما در نحوه اتصال و دسترسی متفاوت هستند. staticmethod یک تابع منظم است که در یک کلاس تعریف شده و میتواند در خود کلاس فراخوانی شود، در حالی که classmethod کلاس را به عنوان اولین پارامتر (cls) دریافت میکند و میتواند در کلاس یا نمونههای کلاس فراخوانی شود.
پیشنهاد مطالعه: آموزش کامل دستور Import در پایتون
سخن پایانی
در این راهنمای جامع، مفهوم کلاس متد را در پایتون بررسی کردهایم. ما کاربردها و مزایای آن، از جمله دسترسی به ویژگیهای سطح کلاس، ارائه سازندگان جایگزین و اجرای عملیات در سطح کلاس را مورد بحث قرار دادهایم. ما همچنین مثالهای عملی ارائه کردهایم تا نشان دهیم چگونه میتوان از Classmethod در پایتون سناریوهای دنیای واقعی استفاده کرد. با استفاده از کلاس متد در کد پایتون خود، میتوانیم برنامههای شی گرا کارآمدتر و سازماندهی شده بنویسیم.
یادگیری پایتون
یادگیری اصولی و حرفهای پایتون مستلزم آموزش دیدن، تمرین کردن و اعتمادبهنفس است. در این میان آموزش اصولی از اهمیت ویژهای برخوردار است. برای این هدف دورههای پایتون مکتب خونه تمام ویژگیهای لازم یک آموزش اصولی را دارند.
اگر به فکر یادگیری پایتون هستید، دورههای آموزش پایتون مکتب خونه در این مسیر میتواند کمک حال بسیار مناسبی برای شما باشد. دورههای آموزش پایتون مکتب خونه به وسیله افراد حرفهای پایتون در ایران تهیه و تدوین شدهاند و تمام استاندارهای لازم یک آموزش اصولی را دارند. هماکنون از طریق صفحه آموزش پایتون مکتب خونه میتوانید انواع دورههای آموزش پایتون را از مقدماتی تا پیشرفته برای حوزههای مختلف مشاهده کنید