ازگر کے سپر() اور __init__() طریقوں کو تلاش کرنا

ازگر کے سپر() اور __init__() طریقوں کو تلاش کرنا
ازگر کے سپر() اور __init__() طریقوں کو تلاش کرنا

ازگر کے سپر () کے ساتھ شروع کرنا

Python کے آبجیکٹ اورینٹڈ پروگرامنگ میں super() فنکشن کا استعمال اکثر ابتدائی افراد کے لیے الجھن کا باعث ہوتا ہے۔ یہ طاقتور فنکشن بنیادی طور پر اس بات کو یقینی بنانے کے لیے استعمال کیا جاتا ہے کہ بیس کلاسز کے __init__() طریقوں کو مناسب طریقے سے بلایا گیا ہے، جس سے زیادہ قابل برقرار اور قابل توسیع کوڈ ڈھانچہ کی سہولت ملتی ہے۔

اس مضمون میں، ہم Base.__init__() اور super().__init__() کے استعمال کے درمیان فرق کا جائزہ لیں گے، اور دریافت کریں گے کہ super() عام طور پر ترجیحی نقطہ نظر کیوں ہے۔ ہم ان تصورات کو عملی طور پر واضح کرنے کے لیے کوڈ کی مثالیں بھی فراہم کریں گے۔

کمانڈ تفصیل
Base.__init__(self) بیس کلاس کے __init__ طریقہ کو براہ راست کال کرتا ہے۔ اس بات کو یقینی بنانے کے لیے استعمال کیا جاتا ہے کہ بیس کلاس کو صحیح طریقے سے شروع کیا گیا ہے۔
super(ChildB, self).__init__() super() فنکشن کا استعمال کرتے ہوئے بیس کلاس کے __init__ طریقہ کو کال کرتا ہے۔ بیس کلاسز شروع کرنے کے لیے یہ ترجیحی طریقہ ہے۔
print("Base created") کنسول پر ایک پیغام پرنٹ کرتا ہے۔ ڈیبگنگ اور اس بات کی تصدیق کے لیے استعمال کیا جاتا ہے کہ بیس کلاس کو شروع کیا گیا ہے۔
print("ChildA created") کنسول پر ایک پیغام پرنٹ کرتا ہے۔ اس بات کی تصدیق کے لیے استعمال کیا جاتا ہے کہ چائلڈ اے بنایا گیا ہے اور اسے شروع کیا گیا ہے۔
print("ChildB created") کنسول پر ایک پیغام پرنٹ کرتا ہے۔ اس بات کی تصدیق کے لیے استعمال کیا جاتا ہے کہ چائلڈ بی بنایا گیا ہے اور اسے شروع کیا گیا ہے۔
print("Derived class with Base.__init__") ایک پیغام پرنٹ کرتا ہے جس سے ظاہر ہوتا ہے کہ ماخوذ کلاس کو Base.__init__ کا استعمال کرتے ہوئے شروع کیا گیا تھا۔
print("Derived class with super().__init__") ایک پیغام پرنٹ کرتا ہے جس سے ظاہر ہوتا ہے کہ ماخوذ کلاس کو سپر().__init__ کا استعمال کرتے ہوئے شروع کیا گیا تھا۔

ازگر کے سپر () کے استعمال کی گہرائی سے وضاحت

اوپر فراہم کردہ اسکرپٹ کے استعمال کی وضاحت کرتے ہیں۔ super() اور Base.__init__() Python میں کلاس کے درجہ بندی کے اندر بیس کلاسز کو شروع کرنے کے لیے۔ پہلی اسکرپٹ میں، ہم ایک بیس کلاس کی وضاحت کرتے ہیں جسے کہتے ہیں۔ Base ایک کے ساتھ __init__() وہ طریقہ جو کلاس کی ایک مثال شروع ہونے پر "بیس تخلیق شدہ" پرنٹ کرتا ہے۔ پھر ہم دو اخذ شدہ کلاسوں کی وضاحت کرتے ہیں، ChildA اور ChildB. میں ChildA, the Base.__init__(self) طریقہ کو واضح طور پر اپنے اندر کہا جاتا ہے۔ __init__() اس بات کو یقینی بنانے کا طریقہ کہ بیس کلاس کو صحیح طریقے سے شروع کیا گیا ہے۔ یہ نقطہ نظر سیدھا ہے لیکن اگر متعدد بیس کلاسز یا پیچیدہ وراثت کے ڈھانچے ہوں تو یہ بوجھل ہوسکتا ہے۔

میں ChildB, the super(ChildB, self).__init__() اس کے بجائے طریقہ استعمال کیا جاتا ہے۔ دی super() Python میں فنکشن بیس کلاس کے طریقوں کو کال کرنے کا ایک زیادہ لچکدار اور برقرار رکھنے والا طریقہ ہے، خاص طور پر متعدد وراثت کے منظرناموں میں۔ یہ میتھڈ ریزولوشن آرڈر (MRO) کی پیروی کرتے ہوئے، درست ترتیب میں بلائے جانے والے طریقہ کو خود بخود حل کرتا ہے۔ یہ نہ صرف کوڈ کو آسان بناتا ہے بلکہ اسے طبقاتی درجہ بندی میں ہونے والی تبدیلیوں کے لیے مزید مضبوط اور موافق بناتا ہے۔ دوسرا اسکرپٹ ان تصورات پر مزید وضاحت کرتا ہے کے براہ راست استعمال کا موازنہ کرتا ہے۔ Base.__init__() اور super() فنکشن، یہ ظاہر کرتا ہے کہ کس طرح ہر طریقہ ابتدائی عمل کو متاثر کرتا ہے۔

کلاس وراثت میں ازگر کے سپر () کو سمجھنا

ازگر - بیس کلاس __init__() کو کال کرنے کے لیے super() کا استعمال

class Base(object):
    def __init__(self):
        print("Base created")

class ChildA(Base):
    def __init__(self):
        Base.__init__(self)
        print("ChildA created")

class ChildB(Base):
    def __init__(self):
        super(ChildB, self).__init__()
        print("ChildB created")

ChildA()
ChildB()

بیس کلاس کے آغاز میں فرق تلاش کرنا

ازگر - بیس کا موازنہ کرنا۔__init__() بمقابلہ سپر ().__init__()

class Base:
    def __init__(self):
        print("Base class initialized")

class DerivedWithBaseInit(Base):
    def __init__(self):
        Base.__init__(self)
        print("Derived class with Base.__init__")

class DerivedWithSuperInit(Base):
    def __init__(self):
        super().__init__()
        print("Derived class with super().__init__")

print("Creating DerivedWithBaseInit:")
derived1 = DerivedWithBaseInit()

print("Creating DerivedWithSuperInit:")
derived2 = DerivedWithSuperInit()

ازگر کے سپر() فنکشن میں گہرا غوطہ لگانا

جبکہ پچھلی وضاحتیں بنیادی استعمال پر مرکوز تھیں۔ super() اور Base.__init__()، استعمال کرنے کے کچھ جدید پہلوؤں اور فوائد کو سمجھنا ضروری ہے۔ super(). ایک اہم فائدہ متعدد وراثت کے ساتھ اس کی مطابقت ہے۔ ایک پیچیدہ طبقاتی درجہ بندی میں، جہاں ایک کلاس متعدد بیس کلاسوں سے وراثت میں مل سکتی ہے۔ super() اس بات کو یقینی بناتا ہے کہ تمام بیس کلاسز میتھڈ ریزولوشن آرڈر (MRO) کے مطابق صحیح طریقے سے شروع کی گئی ہیں۔ یہ ممکنہ مسائل کو روکتا ہے جہاں بیس کلاس کو متعدد بار شروع کیا جاسکتا ہے یا بالکل نہیں۔

ایک اور اہم پہلو کوڈ کی بہتر پڑھنے کی اہلیت اور برقراری ہے۔ استعمال کرتے وقت Base.__init__()، پروگرامر کو واضح طور پر بیس کلاس کا نام دینا چاہیے، کوڈ کو کم لچکدار بناتا ہے۔ اگر بیس کلاس کا نام بدل جاتا ہے یا وراثت کا ڈھانچہ تیار ہوتا ہے، تو ہر براہ راست کال Base.__init__() اپ ڈیٹ کرنے کی ضرورت ہے. اس کے برعکس میں، super() کوڈ کو تبدیلیوں کے لیے مزید موافق بناتے ہوئے، بیس کلاس کے نام کو ختم کرتا ہے۔ یہ تجرید پولیمورفزم اور انکیپسولیشن کے اصولوں کے ساتھ بھی مطابقت رکھتا ہے، جو آبجیکٹ پر مبنی پروگرامنگ میں بنیادی حیثیت رکھتے ہیں۔

Python's super() کے بارے میں عام سوالات اور جوابات

  1. کیا super() ازگر میں؟
  2. super() ایک بلٹ ان فنکشن ہے جو آپ کو والدین یا بہن بھائی طبقے سے طریقوں کو کال کرنے کی اجازت دیتا ہے، وراثت کے درجہ بندی میں مناسب ابتداء اور طریقہ کار کے حل کو یقینی بناتا ہے۔
  3. وہ کیسے super() سے مختلف Base.__init__()?
  4. super() ایم آر او کی بنیاد پر کال کیے جانے والے طریقہ کو متحرک طور پر حل کرتا ہے، جبکہ Base.__init__() براہ راست ایک مخصوص بیس کلاس طریقہ کو کال کرتا ہے، جو کم لچکدار ہوتا ہے۔
  5. کیوں ہے super() ایک سے زیادہ وراثت میں ترجیح دی؟
  6. متعدد وراثت میں، super() اس بات کو یقینی بناتا ہے کہ تمام بیس کلاسز کو ایم آر او کے مطابق صحیح طریقے سے شروع کیا گیا ہے، ڈپلیکیٹ یا گمشدہ ابتدائیوں سے گریز کیا گیا ہے۔
  7. کر سکتے ہیں۔ super() کے باہر استعمال کیا جائے۔ __init__()?
  8. جی ہاں، super() والدین یا بہن بھائی طبقے سے کسی بھی طریقے کو کال کرنے کے لیے استعمال کیا جا سکتا ہے، نہ صرف __init__().
  9. طریقہ ریزولوشن آرڈر (MRO) کیا ہے؟
  10. MRO وہ ترتیب ہے جس میں Python کلاسوں کے درجہ بندی میں طریقے تلاش کرتا ہے۔ اس کا تعین C3 لائنرائزیشن الگورتھم سے ہوتا ہے۔
  11. آپ کسی کلاس کے MRO کو کیسے دیکھتے ہیں؟
  12. آپ ایم آر او کو استعمال کرکے دیکھ سکتے ہیں۔ ClassName.mro() طریقہ یا ClassName.__mro__ وصف۔
  13. اگر آپ استعمال نہیں کرتے ہیں تو کیا ہوتا ہے۔ super() ماخوذ کلاس میں؟
  14. اگر آپ استعمال نہیں کرتے ہیں۔ super()، بیس کلاس کو صحیح طریقے سے شروع نہیں کیا جا سکتا ہے، جس کی وجہ سے ممکنہ غلطیاں یا غیر متوقع رویہ پیدا ہو سکتا ہے۔
  15. استعمال کرنا ممکن ہے؟ super() ازگر 2 میں؟
  16. ہاں، لیکن نحو مختلف ہے۔ ازگر 2 میں، آپ استعمال کرتے ہیں۔ super(ClassName, self).method()، جبکہ ازگر 3 میں، آپ آسانی سے استعمال کرتے ہیں۔ super().method().

کلیدی تصورات کو سمیٹنا

استعمال کرنا super() پائتھون میں نہ صرف بیس کلاسوں کی مناسب شروعات کو یقینی بناتا ہے بلکہ کوڈ کی لچک اور برقراری کو بھی بڑھاتا ہے۔ یہ خاص طور پر وراثت کے متعدد منظرناموں میں فائدہ مند ہے جہاں بنیادی طبقے کے طریقوں پر براہ راست کالیں بوجھل اور غلطی کا شکار ہو سکتی ہیں۔ بیس کلاس کے ناموں کو خلاصہ کرکے، super() کلینر اور زیادہ قابل اطلاق کوڈ کی اجازت دیتا ہے۔ کی باریکیوں کو سمجھنا super() بمقابلہ Base.__init__() مضبوط آبجیکٹ پر مبنی ازگر کوڈ لکھنے کے لیے ضروری ہے۔