سبق Object Oriented Programming

محمداحمد

لائبریرین
Object Oriented Programming

پائتھون بنیادی طور پر ایک Object Oriented Programming Language ہے۔ آگے ہم اسے مختصراً OOP کہیں گے۔سوال یہ پیدا ہوتا ہے کہ Object Oriented سے کیا مراد ہے۔

اولین روایات کو دیکھا جائے تو ایک عمومی پروگرام ایک ترکیب (Recipe) کی طرح ہوا کرتا ہے جس میں ہدایات (instructions) بالترتیب لکھی ہوئی ہوتی ہیں۔ یہ ہدایات کسی مخصوص مقصد کے حصول کے لئے شروع سے آخر تک ترتیب وار عمل پذیر ہوتی ہیں۔ پروگرامنگ کا یہ انداز Procedural Programming کہلاتا ہے۔ Procedural Programming میں اولین حیثیت طریقہ کار (Procedure / Logic) کی ہوتی ہے اور پروگرام کے زیرِ اثر مواد (Object) کی حیثیت ثانوی ہوتی ہے۔ تاہم جیسے جیسے پروگرام (Procedural Program) طویل اور پیچیدہ ہوتا جاتا ہے اسے Procedural Programming پر چلانا دشوار ہو جاتا ہے۔ ایسے میں Object Oriented Programming ہمارے کام کو آسان بناتی ہے۔

Procedural Programming کے برعکسOOP میں Object کو مرکزی حیثیت حاصل ہوتی ہے۔ اور طریقہ کار (Procedure / Logic) ثانوی حیثیت رکھتے ہیں۔ OOP میں Object کو مرکزی حیثیت حاصل ہوتی ہے اور طریقہ کار (Procedures / Logic) اسی کے ارد گرد گھومتے نظر آتے ہیںِ۔
 

محمداحمد

لائبریرین
OBJECT

Object سے مراد وہ مواد ہے جس پر کسی پروگرام کی ہدایات ( Instructions) اثر انداز ہوتی ہیں۔ Object ایک شخص بھی ہو سکتا ہے، جس کی خصوصیات (Properties) میں اُس کا مخصوص نام، عمر اور پتہ ہو سکتی ہیں۔ یا ایک کمپنی ہو سکتی ہے جس کی خصوصیات اس کا جائے وقوع اور ملازمین کی تعداد ہوسکتی ہیں۔ اس سے بھی بڑھ کر ایک Object کسی پروگرام کی مواصلاتی سطح (interface) پر موجود ایک بٹن (Button) بھی ہو سکتا ہے۔

CLASS

آبجیکٹ اورینٹڈ طریقہ کار (Object Oriented Approach ) میں سب سے پہلا کام آبجیکٹ کو ڈیفائن کرنا ہے۔ اس کام کے لئے ہم classes کا استعمال کرتے ہیں۔ کلاس کو ایک سانچے (Template) کی طرح سمجھا جا سکتا ہے۔ یعنی کلاس اس بات کی رہنمائی (Guidance) فراہم کرتی ہے کہ ہمارا Object کس طرح کا ہوگا۔ Object کو (Instance' of a class') بھی کہا جاتا ہے۔

اس بات کو مزید سمجھنے کے لئے ایک مثال کی ضرورت ہوگی۔ فرض کیجے آپ ایک class بناتے ہیں person کے نام سے ۔ اور اس class کی خصوصیات میں اس شخص (Person) کا نام (name) اور عمر (age) اس کی خصوصیات ہیں۔ اب فرض کیجے اس class سے ہم پہلا Object جو بناتے ہیں اس کا نام "خالد" ہے اور اس کی عمر 23 برس۔ لیکن اسی کلاس سے بننے والا دوسرا Object "راشد" کے نام سے ہو سکتا ہے اور اس کی عمر 24 ہو سکتی ہے۔ یعنی ہم ایک کلاس سے کئی Object بنا سکتے ہیں اور ہر Object دوسرے سے مختلف خصوصیات (Properties) رکھ سکتا ہے۔
 

محمداحمد

لائبریرین
DEFINING A CLASS

پائتھون میں class کو بیان کرنے کے لئے مخصوص لفظ "class" لکھ کر اس کے آگے کلاس کا مطلوبہ نام لکھ دیا جاتا ہے۔ class کے نام کے بعدایک کولن ( : ) لگایا جاتا ہے۔ اور class کے تحت آنے والا تمام کوڈ حاشیہ بند (indented) ہوتا ہے(جیسا کہ فنکشن میں ہوتا ہے)۔ مثلاً ہم ایک کلاس pet کے نام سے متعارف کرواتے ہیں۔
PHP:
class pet:

لیجے ہماری پہلی class بن گئی ہے۔ لیکن اب تک ہماری کلاس میں کچھ بھی موجود نہیں ہے۔ چلیے کچھ متغیر (variables) ہی تفویض کرتے ہیں۔ سب سے پہلا (variable)متغیر "number_of_legs" بناتے ہیں کہ ہر Object (جو یہاں کوئی pet ہی ہوگا) کی ٹانگوں کی تعداد مختلف ہو سکتی ہے۔ اپنے (variable)متغیر کو ہمیں قدر (value) بھی تفویض (assign) کرنی ہوگی اور نہ دینے کی صورت میں error کا سامنا ہو سکتا ہے۔ ہم فی الحال خانہ پوری کے لئے 0 کی ویلیو پاس کریں گے۔
PHP:
class pet:
    number_of_legs = 0

کلاس کی تدوین براہِ راست نہیں کی جاتی بلکہ اس کام کے لئے class کا ایک Object/ Instance بناتے ہے اور پھر کلاس کی خصوصیات(attributes) میں رد و بدل کا کام کیا جاتا ہے۔ اب ہم ایک (variable)متغیر cat میں اس کلاس کو تفویض کرتے ہیں۔ کسی ویری ایبل کو کلاس تفویض کرنے کے لئے کلاس نام کے بعد قوسین ( Parenthesis) کا استعمال کیا جاتا ہے۔
PHP:
class pet:
    number_of_legs = 0
 
cat = pet()


کسی مفعول (Object or Instance of a class) کی خصوصیات (Properties / Attributes) میں تبدیلی کے لئے اس کی کلاس (class) میں موجود متغیرات (variables) کو نئی قدر (value) تفویض (assign) کی جا سکتی ہے۔ متغیر (variable) کو نئی قدر (value) تفویض (assign) کرنے کے لئے یوں تو عمومی طریقہ ہی استعمال کیا جاتا ہے سوائے اس کے کہ متغیر (variable) سے پہلے مفعول (Object) کا نام اور ایک نقطہ (dot) لگایا جاتا ہے۔ مثلا اگر ہم اپنے آبجیکٹ cat میں موجود متغیر (variable ) کی نئی قدر(value) وضع کرنا چاہیں تو ہم کچھ یوں لکھیں گے۔ cat.number_of _legs۔

اس کی مثال درج ذیل میں دیکھی جا سکتی ہے۔

PHP:
>>> class pet:
    number_of_legs = 0
 
 
>>> cat = pet()
>>> cat.number_of_legs = 4
>>> print ("cat has %s legs."%cat.number_of_legs)
cat has 4 legs.
>>>

یہاں ہم نے متغیر number_of_legs کو نئی قدر 4 تفویض کی اور اُسے پرنٹ فنکشن کے ذریعے اُسی طرح سے کال کر لیا۔
 

محمداحمد

لائبریرین
قاعدے (METHODS)

اب تک ہم نے کلاس کے متعلق جو بھی کام کیا وہ بہت سادہ تھا اور صرف کلاس بنانے اور متغیرات کو محفوظ کرنے تک محدود تھا۔ اب ہم کچھ آگے بڑھیں گے۔

CLASS METHODS

سادہ لفظوں میں یوں سمجھیے کہ وہ فنکشنز (Functions) جو کسی کلاس کے بلاک میں بنائے جاتے ہیں قاعدے (Methods) کہلاتے ہیں۔ کسی کلاس (class) میں قاعدہ (method) بالکل ویسا ہی ہوتا ہے جیسا کہ ہم ایک عمومی فنکشن (function) بناتے ہیں۔ سوائے ایک فرق کے۔ اور وہ یہ کہ کلاس (class) میں موجود قاعدے (method) کو ایک دلیل self ضرور دیا جاتا ہے۔ سو جب پائتھون فنکشن کو کال کرتا ہے یہ (self) متعلقہ مفعول (current object) کو بطور پہلی دلیل فراہم کر دیتا ہے۔ رہا یہ سوال کہ اس مقصد کے لئے self ہی کیوں لکھا جاتا ہے تو اس کا جواب یہ ہے کہ ایسا روایت کے طور پر (By Convention) کیا جاتا ہے (اور احسن سمجھا جاتا ہے )۔ گو کہ اس لفظ کا لکھنا ضروری نہیں ہے تاہم زیادہ بہتر یہی ہے کہ self کا لفظ ہی استعمال کیا جائے تاکہ بعد میں دیکھنے پر کوڈ لکھنے والے کو اور کسی دوسرے کوڈ کے پڑھنے والے کو بھی سمجھنے میں آسانی رہے۔ ++c اور java میں اس مقصد کے this کا keyword استعمال کیا جاتا ہے۔

اب ہم یہی بات ایک مثال کی مدد سے سمجھتے ہیں۔ فرض کیجے کہ ہم اپنی pet والی کلاس میں ایک قاعدہ (method) بناتے ہیں جس کا نام sleep ہے۔

یہ کوڈ دیکھیے:
PHP:
>>> class pet:
    number_of_legs= 0
    def sleep (self):
        print ("zzz")
 
 
>>> cat = pet()
>>> cat.sleep()
zzz
>>>

جیسا کہ اوپر بیان کیا گیا ہے یہ قاعدہ (method) بالکل اسی طرز پر بنایا گیا ہے جیسا کہ فنکشن بنائے جاتے ہیں۔ یعنی سب سے پہلے def کا keyword پھر قاعدے کا نام اور پھر دو عدد قوسین۔ اور قوسین کے مابین ایک دلیل (argument) جیسا کہ بتایا گیا self کے نام سے۔

قاعدے (method) کو کال بھی ویسے ہی کیا جاتا ہے جیسا کہ کلاس میں موجود متغیرات کو کیا جاتا ہے۔ یہاں جب ہم نے ()cat.sleep کو کال کیا تو نتیجے میں پائتھون نے zzz پرنٹ کیا ہے جو ہمارے دیئے گئے کوڈ کے عین مطابق ہے۔

*****

اب ہم اپنی کلاس pet میں ایک اور فنکشن بناتے ہیں جس کا نام ہوگا count_legs۔ یہ فنکشن ہمیں self کے آرگیومینٹ کو مزید سمجھنے میں مدد دے گا۔
PHP:
>>> class pet:
    number_of_legs = 0
    def sleep (self):
        print ('zzz')
 
 
    def count_legs (self):
        print ("I have %s legs"%self.number_of_legs)

sleep method کی طرح ہم نے count_legs میں بھی ایک آرگیومینٹ self فراہم کیا ہے۔ یہ self ہمیشہ اس مفعول (Object) کا حوالہ ہوگا جس پر اس قاعدے (method ) کو کال کیا جائے گا۔

count_legs میں ہم نے اپنے مفعول (جو ایک پالتو جانور ہوگا) کی ٹانگوں کی تعداد پرنٹ کروائی ہے۔ چونکہ کلاس بناتے وقت ہمیں نہیں معلوم کہ اس method کو کس object کے ساتھ کال کیا جائے گا سو ہم Object کے حوالے کے لئے متغیر (variable) کے نام کے ساتھ self لکھتے ہیں۔ یعنی کلاس میں متغیر کو کال کرنے کا اظہاریہ کچھ یوں ہوتا ہے۔ self.name_of_variable

ذیل میں ہم نے دو مختلف مفعول (Object) پر count_legs کے قاعدے (method ) کو کال کیا ہے۔ آپ دیکھ سکتے ہیں کہ مفعول اور اس سے منسلکہ معلومات کے مطابق دونوں کالز کا نتیجہ مختلف ہے۔
PHP:
>>> cat = pet()
>>> cat.number_of_legs = 4
>>> cat.count_legs()
I have 4 legs
>>>
 
 
 
>>> duck = pet()
>>> duck.number_of_legs = 2
>>> duck.count_legs()
I have 2 legs
>>>

پہلی مثال (instance) میں جب ہم نے count_legs کے قاعدے (method ) کو cat کے ساتھ کال کیا تو فنکشن نے pet کی ٹانگوں کی تعداد 4 بتائی۔ جب کہ یہی عمل جب duck کے مفعول (Object) کے ساتھ کال کیا تو جواب 2 رہا۔

اس سے پتہ چلا کہ کوئی بھی کلاس اس طرح سے بنائی جاتی ہے کہ وہ ہر مفعول (Object or Instance of the class) کو انفرادی حیثیت فراہم کرنے کے قابل ہو۔ اس بات کو یوں بھی سمجھا جا سکتا ہےکہ کلاس کی مدد سے تیار کیا جانے والا ہر آبجیکٹ اپنی منفرد حیثیت اور اوصاف رکھتا ہے۔

**********
 
Top