اس لیکچر میں، ہم python میں کلاسز، کنسٹرکٹرز اور وراثت کے بارے میں سیکھیں گے۔
یہ تصورات ایک بڑے پروگرام میں واقعی اہم ہیں جہاں مختلف اقسام کی وضاحت کی ضرورت ہے۔
کلاسز
پروگرامنگ میں کلاسز ضروری ہیں اور وہ ازگر کے لیے مخصوص نہیں ہیں۔ بہت سے دوسرے پروگرامنگ زبانوں کلاسوں کے تصور کی حمایت کرتے ہیں۔ ہم ڈیٹا کی نئی اقسام کی وضاحت کے لیے کلاسز کا استعمال کرتے ہیں۔
اب تک، ہم نے Python میں ڈیٹا کی بنیادی اقسام جیسے نمبرز، سٹرنگز اور بولین کے بارے میں سیکھا ہے۔ یہ Python میں بنیادی یا سادہ ڈیٹا کی قسمیں ہیں۔ ہم نے کچھ پیچیدہ ڈیٹا کی قسمیں بھی دیکھی ہیں جیسے فہرستیں اور لغات۔
اگرچہ یہ اقسام انتہائی کارآمد ہیں، لیکن انہیں ہمیشہ پیچیدہ تصورات کو ماڈل کرنے کے لیے استعمال نہیں کیا جا سکتا۔ مثال کے طور پر، ایک نقطہ، یا خریداری کی ٹوکری کے خیال کے بارے میں سوچو. خریداری کی ٹوکری بولین یا فہرست نہیں ہے۔ یہ ایک مختلف قسم کا ڈیٹا ہے۔ لہذا ہم حقیقی تصورات کو ماڈل کرنے کے لیے نئی اقسام کی وضاحت کے لیے کلاسز کا استعمال کر سکتے ہیں۔
اب، آئیے ایک نئی ڈیٹا ٹائپ کی وضاحت کرتے ہیں جسے پوائنٹ کہتے ہیں۔ اس نئی قسم کے طریقے ہوں گے جیسا کہ ہم نے پہلے چیک کیا تھا۔
اس طرح آپ یہ کریں گے:
ہم "کلاس" کلیدی لفظ کا استعمال کرتے ہوئے کلاس کی وضاحت کرتے ہوئے شروع کرتے ہیں اور اس کے بعد ہم اپنی کلاس کو ایک نام دیتے ہیں۔
class Point
اب، نام دینے کے کنونشن کو دیکھیں جو میں نے یہاں استعمال کیا ہے۔ میں نے یہاں پہلا حرف بڑا کیا ہے، یہ وہی ہے جسے ہم پاسکل نام دینے کا کنونشن کہتے ہیں۔ یہ کنونشن اس سے مختلف ہے جسے ہم اپنے متغیرات اور افعال کو نام دینے کے لیے استعمال کرتے ہیں جس کے لیے ہم ہمیشہ چھوٹے حروف کا استعمال کرتے ہیں اور انڈر سکور کا استعمال کرتے ہوئے متعدد الفاظ کو الگ کرتے ہیں۔ لیکن کلاسوں کا نام لیتے وقت، ہم ایک سے زیادہ الفاظ کو الگ کرنے کے لیے انڈر سکور کا استعمال نہیں کرتے ہیں، ہم ہر لفظ کے پہلے حرف کو بڑا کرتے ہیں۔
ہماری کلاس کی وضاحت کرنے کے بعد، ایک بڑی آنت کا استعمال کیا جاتا ہے جس کا مطلب ہے کہ اب ایک بلاک کی وضاحت کی گئی ہے۔
class Point:
def move (self):
اس بلاک میں، ہم پوائنٹس سے تعلق رکھنے والے تمام افعال یا طریقوں کی وضاحت کر سکتے ہیں۔ مثال کے طور پر، ہم نقطہ کو حرکت دینے کے لیے "move" نامی فنکشن کی وضاحت کر سکتے ہیں۔ نوٹ کریں کہ جیسے ہی ہم اوپن قوسین ٹائپ کرتے ہیں، PyCharm خود بخود یہاں "self" کا اضافہ کر دیتا ہے۔ یہ ایک خاص کلیدی لفظ ہے اور میں جلد ہی اس پر واپس آؤں گا۔ آئیے ٹرمینل پر "move" پرنٹ کریں۔
print("move")
آئیے ایک اور طریقہ کی وضاحت کریں جیسے "ڈرا" اور اسے ٹرمینل پر پرنٹ کریں۔
def draw(self):
print("draw")
ہم اپنی "پوائنٹ" کلاس کی تعریف کے ساتھ کام کر چکے ہیں۔ اس نئی قسم کے ساتھ، ہم نئی اشیاء بنا سکتے ہیں۔ ایک کلاس صرف بلیو پرنٹ یا اشیاء بنانے کے لیے ٹیمپلیٹ کی وضاحت کرتی ہے جو اس بلیو پرنٹ کی بنیاد پر اصل مثالیں ہیں۔ ایک آبجیکٹ بنانے کے لیے، ہم اپنی کلاس کا نام ٹائپ کرتے ہیں اور پھر اسے فنکشن کی طرح کال کرتے ہیں۔ یہ ایک نئی چیز بناتا ہے اور پھر اسے واپس کرتا ہے۔ پھر ہم اس آبجیکٹ کو متغیر میں محفوظ کر سکتے ہیں۔ مجھے دکھانے دیجئے:
یہاں ہم نے ایک "پوائنٹ 1" کی تعریف کی ہے جو کہ تین جہتی نقطہ ہے۔ آپ دیکھ سکتے ہیں کہ ہم ٹرمینل پر انفرادی نقاط پرنٹ کر سکتے ہیں۔
ہم اس نقطہ کے ساتھ دو طریقے "ڈرا" اور "موو" استعمال کر سکتے ہیں۔
لہذا دوبارہ حاصل کرنے کے لیے، ہم نئی اقسام کی وضاحت کے لیے کلاسز کا استعمال کرتے ہیں اور ان اقسام میں ایسے طریقے ہوسکتے ہیں جن کی وضاحت ہم کلاس کے باڈی میں کرتے ہیں۔ کلاسوں میں ایسی صفات ہو سکتی ہیں جو ہم اپنے پروگراموں میں کہیں بھی سیٹ کر سکتے ہیں۔
تعمیر کار
اب تک، ہم نے کلاسز کا استعمال کرتے ہوئے نئی قسمیں بنانے کا طریقہ سیکھا ہے۔ اب اس پر عمل درآمد میں ایک چھوٹا سا مسئلہ ہے۔ ہم کلاسز کا استعمال کرتے ہوئے x یا y کوآرڈینیٹ کے بغیر پوائنٹ آبجیکٹ بنا سکتے ہیں اور یہ مثالی نہیں ہے۔ مجھے دکھانے دیجئے.
آئیے ایک پوائنٹ بنائیں اور اسے پرنٹ کریں اس سے پہلے کہ ہم x کوآرڈینیٹ سیٹ کریں۔ ہمارے پروگرام کو چلانے کے نتیجے میں انتساب کی خرابی اس طرح ہوتی ہے:
اس کا مطلب ہے کہ پوائنٹ آبجیکٹ میں x نامی کوئی صفت نہیں ہے۔ اب مسئلہ یہ ہے کہ x یا y کوآرڈینیٹ کے بغیر پوائنٹ آبجیکٹ کا ہونا ممکن ہے۔ اس کا کوئی مطلب نہیں ہے کیونکہ جب بھی ہم کسی نقطہ کے بارے میں بات کرتے ہیں تو ہمیں یہ جاننے کی ضرورت ہوتی ہے کہ وہ نقطہ کہاں واقع ہے۔ اس مسئلے کو حل کرنے کے لیے، ہم کنسٹرکٹر کا استعمال کرتے ہیں۔ کنسٹرکٹر ایک فنکشن ہے جو کسی چیز کو بنانے کے وقت بلایا جاتا ہے۔
یہاں یہ ہے کہ ہم کنسٹرکٹر کو کس طرح استعمال کرتے ہیں۔ سب سے پہلے، اوپر والے پروگرام میں x اور y کوآرڈینیٹ ویلیو کو پاس کرتے ہیں۔
point = Point(10, 20)
print(point.x)
اب، ہمیں اس کلاس میں ایک خاص طریقہ شامل کرنے کی ضرورت ہے جسے کنسٹرکٹر کہتے ہیں۔ اس کی ترکیب اس طرح ہے:
def __init__(self, x, y):
init
ابتداء کے لیے مختصر ہے، اور یہ وہ فنکشن یا طریقہ ہے جو ایک نیا نقطہ آبجیکٹ بننے پر کال کیا جاتا ہے۔ اس کے بعد x اور y کو شامل کیا جاتا ہے۔ self
دو اضافی پیرامیٹرز شامل کرنے کے لیے۔
اس کے بعد، ہمیں x اور y کو پاس شدہ اقدار یعنی 10 اور 20 سے نقشہ بنانا چاہیے۔
self.x = x
self.y = y
ہم استعمال کرتے ہیں self
موجودہ آبجیکٹ کا حوالہ دینے کے لیے اور پھر ہم نے "x" فنکشن کو پاس کیے گئے ایکس آرگیومینٹ کے لیے x وصف سیٹ کیا۔ اس طرح، استعمال کرتے ہوئے init
طریقہ، ہم اپنی اشیاء کو شروع کر سکتے ہیں. اس طریقہ کو کنسٹرکٹر کہا جاتا ہے۔ آئیے اپنا پروگرام چلائیں۔
اب، ہم بعد میں x اور y کوآرڈینیٹ تبدیل کر سکتے ہیں۔ آئیے ایکس کوآرڈینیٹ کو اپ ڈیٹ کریں:
point = Point(10, 20)
point.x = 11
print(point.x)
اب، ایکس کوآرڈینیٹ کو 11 کی قدر میں اپ ڈیٹ کیا گیا ہے۔
ورزش
یہاں آپ کے لیے ایک دلچسپ ورزش ہے۔
میں چاہتا ہوں کہ آپ ایک نئی قسم کی وضاحت کریں جسے ایک شخص کہتے ہیں۔ ان "شخص" اشیاء میں "" ہونا چاہئےname
"صفت کے ساتھ ساتھ ایک"talk()
”طریقہ۔
یہ ایک آسان کام ہے اور اس میں چند منٹ سے زیادہ نہیں لگنا چاہیے۔
حل
اس طرح کلاس "Person" کی وضاحت کے ساتھ شروع کریں:
class Person:
self.name = name
ہم بعد میں کنسٹرکٹر کی وضاحت کریں گے۔ اب، ہم "Person" آبجیکٹ بنا سکتے ہیں۔ آئیے اسے جان کہتے ہیں۔
john = Person("John Smith")
print(john.name)
john.talk()
اب، کوڈ کے پہلے حصے پر جائیں اور کنسٹرکٹر بنائیں۔
def __init__(self, name):
حتمی کوڈ اس طرح نظر آئے گا:
آپ کلاسز اور کنسٹرکٹرز کے ساتھ مل کر فارمیٹ شدہ تاروں اور دیگر تصورات کو بھی استعمال کر سکتے ہیں۔
وراثت
وراثت کلاسز سے وابستہ ایک اور تصور ہے جو آپ کو کوڈ کو دوبارہ استعمال کرنے دیتا ہے۔
کوڈ کے اس ٹکڑے پر غور کریں۔
class Dog:
def walk(self):
print("walk")
ہم نے "چہل قدمی" کے طریقہ کار کے ساتھ ایک کلاس "کتا" بنایا ہے۔ اس طریقے میں، ہم صرف واک پیغام کو ٹرمینل پر پرنٹ کر رہے ہیں۔ چلیں، ایک حقیقی پروگرام میں، یہاں صرف ایک لائن کے بجائے کوڈ کی 10 لائنیں ہیں۔ مستقبل میں، اگر کسی اور کلاس کو "چہل قدمی" کا طریقہ درکار ہے، تو ہمیں وہ تمام کوڈ دہرانا پڑے گا۔ یہ مثالی نہیں ہے۔
پروگرامنگ میں، ہمارے پاس DRY نامی ایک اصول ہے جو اپنے آپ کو نہ دہرانے کے لیے مختصر ہے۔ چلیں مستقبل میں کسی وقت، ہمیں اپنے "چہل قدمی" کے طریقہ کار میں ایک مسئلہ دریافت ہوتا ہے اور اگر ہم نے اس طریقہ کو کئی دوسری جگہوں پر دہرایا ہے یا نقل کیا ہے، تو ہمیں واپس آکر اس مسئلے کو ہر ایک جگہ پر حل کرنا پڑے گا جس کو ہم نے نقل کیا ہے۔ کوڈ اس لیے پروگرامنگ میں ہمیں کسی چیز کی دو بار تعریف نہیں کرنی چاہیے۔
اس مسئلے کو حل کرنے کے مختلف طریقے ہیں لیکن یہاں ہم وہ طریقہ سیکھنے جارہے ہیں جو ابتدائیوں کے لیے آسان ہے اور اسے وراثت کہتے ہیں۔ اس صورت میں، ہم ایک اور کلاس "ممالیہ" بنائیں گے اور اس کلاس میں اپنے "چہل قدمی" وصف کی وضاحت کریں گے۔
class Mammal:
def walk(self):
print("walk")
اپنی "Mammal" کلاس کی وضاحت کرنے کے بعد ہم وراثت کو اس طرح کے اوصاف کو منتقل کرنے کے لیے استعمال کر سکتے ہیں:
کتے اور بلی کی دونوں کلاسیں اپنے والدین کی کلاس میں بیان کردہ تمام طبقاتی طریقوں کو وراثت میں لے رہی ہیں۔ اب، ہم کتوں کے لیے مخصوص طریقے شامل کر سکتے ہیں اس طرح:
class Dog:
def bark(self):
print("bark")
لپیٹ!
یہ سب کلاسوں، تعمیر کنندگان اور وراثت کے تصورات کے ساتھ کلاسوں میں کوڈ کو دوبارہ استعمال کرنے کے بارے میں تھا۔ اب ہم اپنی سیریز کے اختتام کے قریب ہیں۔ اس وقت تک، آپ کو Python میں اچھے، پڑھنے کے قابل اور جامع کوڈ تیار کرنے کے قابل ہونا چاہیے۔
ہم اگلے لیکچر میں ماڈیولز اور پیکجز کا تصور دیکھیں گے۔
جواب دیجئے