जब प्रोग्राम आकार और जटिलता में बढ़ते हैं, तो कोड का प्रबंधन और संगठन करना काफी चुनौतीपूर्ण हो सकता है। फ़ंक्शन और वेरिएबल्स प्रोग्राम के विभिन्न हिस्सों में बिखरे हो सकते हैं, जिससे यह पता लगाना कठिन हो जाता है कि क्या हो रहा है और इससे कोड अव्यवस्थित और कठिन-से-सम्भालने योग्य हो जाता है। यहीं पर क्लासेस, जो ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) का एक आधारस्तंभ हैं, काम आते हैं।
💡
क्लासेस संबंधित डेटा और फ़ंक्शंस को एक साथ बांधने का एक तरीका हैं, जिससे हम 'ऑब्जेक्ट्स' बनाते हैं।
क्लासेस ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) में मौलिक अवधारणाएं हैं।
क्लासेस हमारे कोड में ऑब्जेक्ट्स बनाने के लिए ब्लूप्रिंट की तरह होती हैं। प्रत्येक क्लास संबंधित गुणों (डेटा) और मेथड्स (फ़ंक्शंस) को एक इकाई में समेटती है। उदाहरण के लिए, एक गेम प्रोग्राम में आपके पास Player, Monster, या Item जैसी क्लासेस हो सकती हैं, जिनमें अपने-अपने संबंधित डेटा और मेथड्स होते हैं। इससे बड़े कोडबेस को समझना और प्रबंधित करना आसान हो जाता है, क्योंकि संबंधित फ़ंक्शनालिटीज़ को समूहित किया जाता है, और यह स्पष्ट हो जाता है कि वे एक दूसरे के साथ कैसे इंटरैक्ट करते हैं।
मान लीजिए आप एक लाइब्रेरी को मॉडल करने के लिए सॉफ़्टवेयर बनाना चाहते हैं। आपकी लाइब्रेरी में पुस्तकें होंगी, इसलिए आपको एक Book क्लास बनाने की आवश्यकता होगी:
class Book:
def __init__(self, title, author, pages):
self.title = title # पुस्तक इंस्टेंस को शीर्षक असाइन करें
self.author = author # पुस्तक इंस्टेंस को लेखक असाइन करें
self.pages = pages # पुस्तक इंस्टेंस को पन्नों की संख्या असाइन करें
class कीवर्ड एक नई क्लास को परिचयित करता है, जिसके बाद उसका नाम (Book) आता है। def __init__(self, title, author, pages): लाइन क्लास की प्रारंभिक स्थिति या कंस्ट्रक्टर को परिभाषित करती है। यहीं पर ऑब्जेक्ट इनिशियलाइज़ होता है। self क्लास के इंस्टेंस को संदर्भित करता है। title, author, और pages क्लास के एट्रिब्यूट्स हैं।
आप क्लास को एक फ़ंक्शन की तरह कॉल करके एक नया बुक ऑब्जेक्ट बना सकते हैं:
# Book का एक नया इंस्टेंस बनाएं
mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)
print(mockingbird.title) # To Kill a Mockingbird
print(mockingbird.author) # Harper Lee
print(mockingbird.pages) # 281
ध्यान दें कि हम To Kill a Mockingbird, Harper Lee, और 281 को आर्गुमेंट्स के रूप में पास करते हैं। ये __init__ मेथड को आर्गुमेंट्स के रूप में पास होते हैं (लगभग एक सामान्य फ़ंक्शन की तरह)।
हम Book क्लास के कई इंस्टेंस बना सकते हैं:
# और अधिक बुक इंस्टेंस बनाएं
book2 = Book('1984', 'George Orwell', 328)
book3 = Book('The Great Gatsby', author='F. Scott Fitzgerald', pages=180)
book4 = Book('Moby Dick', 'Herman Melville', pages=720)
# पुस्तकों की कुछ जानकारी प्रिंट करें
print(f'{book2.title} by {book2.author} has {book2.pages} pages.') # 1984 by George Orwell has 328 pages.
print(f'{book3.title} by {book3.author} has {book3.pages} pages.') # The Great Gatsby by F. Scott Fitzgerald has 180 pages.
print(f'{book4.title} by {book4.author} has {book4.pages} pages.') # Moby Dick by Herman Melville has 720 pages.
फ़ंक्शंस की तरह ही, हम __init__ मेथड को पॉज़िशनल और कीवर्ड आर्गुमेंट्स दोनों पास कर सकते हैं।
डेटा के अलावा, क्लासेस फ़ंक्शनालिटी को भी समेट सकती हैं। मान लीजिए, हमारी लाइब्रेरी सिस्टम में, हम एक पुस्तक को पढ़ी हुई चिह्नित करना चाहते हैं। इसके लिए हम अपनी Book क्लास में एक मेथड परिभाषित कर सकते हैं:
class Book:
def __init__(self, title, author, pages):
self.title = title # पुस्तक इंस्टेंस को शीर्षक असाइन करें
self.author = author # पुस्तक इंस्टेंस को लेखक असाइन करें
self.pages = pages # पुस्तक इंस्टेंस को पन्नों की संख्या असाइन करें
self.is_read = False # पुस्तक अभी तक पढ़ी नहीं गई है
def mark_as_read(self): # एक क्लास मेथड
self.is_read = True # पुस्तक को पढ़ी हुई चिह्नित करें
mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)
print(mockingbird.is_read) # False, पुस्तक अभी तक पढ़ी नहीं गई है
mockingbird.mark_as_read() # पुस्तक को पढ़ी हुई चिह्नित करें
print(mockingbird.is_read) # True, पुस्तक पढ़ी जा चुकी है
mark_as_read मेथड is_read एट्रिब्यूट की स्थिति को True में बदल देता है। हम इस मेथड को किसी भी बुक इंस्टेंस पर कॉल कर सकते हैं। यह दर्शाता है कि हम Python में क्लासेस का उपयोग करके संबंधित डेटा और फ़ंक्शनालिटी को एक साथ कैसे समेट सकते हैं।
💡
Python में, self क्लास के इंस्टेंस मेथड में पहले पैरामीटर के लिए एक पारंपरिक नाम है। यह क्लास के वर्तमान इंस्टेंस का एक संदर्भ है। self का उपयोग क्लास के भीतर उसके एट्रिब्यूट्स और मेथड्स तक पहुंचने के लिए किया जाता है।
जब आप क्लास का एक नया ऑब्जेक्ट बनाते हैं, तो Python स्वचालित रूप सेself आर्गुमेंट को उस नए ऑब्जेक्ट के साथ बाइंड कर देता है, इसलिए जब आप एक इंस्टेंस मेथड को कॉल करते हैं तो आपको self पास करने की आवश्यकता नहीं होती।
हालांकि self Python में एक आरक्षित कीवर्ड नहीं है, यह व्यापक रूप से उपयोग किया जाता है क्योंकि यह स्पष्ट और पठनीय शैली को प्रोत्साहित करता है। यह ध्यान रखना महत्वपूर्ण है कि आप कोई और नाम उपयोग कर सकते हैं, लेकिन समुदाय द्वारा self का उपयोग दृढ़ता से अनुशंसित है और इसे सर्वोत्तम अभ्यास माना जाता है।
चुनौती: एक Car क्लास बनाएं
आपसे एक Car क्लास बनाने के लिए कहा गया है जिसमें निम्नलिखित एट्रिब्यूट्स होने चाहिए:
color (कार का रंग)
make (कार का निर्माता)
model (कार का विशिष्ट मॉडल)
year (जिस वर्ष में यह बनी)
इन एट्रिब्यूट्स को क्लास के __init__ मेथड में इनिशियलाइज़ किया जाना चाहिए।
इसके अतिरिक्त, Car क्लास में एक display_details मेथड होना चाहिए। यह मेथड कार के विवरण का एक स्ट्रिंग प्रतिनिधित्व वापस करेगा, जिसका फ़ॉर्मेट होगा [year] [color] [make] [model]।
Input
Output
ㅤ
c = Car('red', 'Ferrari', 'F8', 2023); print(c.display_details())
2023 red Ferrari F8
ㅤ
c = Car('black', 'Tesla', 'Model S', 2021); print(c.display_details())