বেস (সুপার) ক্লাসটি কীভাবে শুরু করব?


125

পাইথনে, আমার নিম্নলিখিত কোড রয়েছে তা বিবেচনা করুন:

>>> class SuperClass(object):
    def __init__(self, x):
        self.x = x

>>> class SubClass(SuperClass):
    def __init__(self, y):
        self.y = y
        # how do I initialize the SuperClass __init__ here?

SuperClass __init__সাবক্লাসে আমি কীভাবে সূচনা করব ? আমি পাইথন টিউটোরিয়াল অনুসরণ করছি এবং এটিতে এটি আবৃত হয় না। আমি যখন গুগলে অনুসন্ধান করেছি, আমি একাধিক করার উপায় খুঁজে পেয়েছি। এটি পরিচালনা করার মানক উপায় কী?

উত্তর:


146

পাইথন (সংস্করণ 3 অবধি) "ওল্ড স্টাইল" এবং নতুন-স্টাইলের ক্লাসগুলিকে সমর্থন করে। নতুন-স্টাইলের ক্লাসগুলি উদ্ভূত objectএবং আপনি যা ব্যবহার করছেন তা হ'ল এবং তাদের বেস শ্রেণীর মাধ্যমে super()উদ্বোধন করুন, যেমন

class X(object):
  def __init__(self, x):
    pass

  def doit(self, bar):
    pass

class Y(X):
  def __init__(self):
    super(Y, self).__init__(123)

  def doit(self, foo):
    return super(Y, self).doit(foo)

যেহেতু পাইথন পুরাতন- এবং নতুন-স্টাইলের ক্লাসগুলি সম্পর্কে জানে, বেস পদ্ধতিটি আহ্বান করার বিভিন্ন উপায় রয়েছে যার কারণে আপনি এটি করার একাধিক উপায় খুঁজে পেয়েছেন।

সম্পূর্ণতার জন্য, পুরানো স্টাইলের ক্লাসগুলি বেস ক্লাসগুলি স্পষ্টভাবে বেস ক্লাসগুলি ব্যবহার করে কল করে

def doit(self, foo):
  return X.doit(self, foo)

তবে যেহেতু আপনার আর পুরানো শৈলী ব্যবহার করা উচিত নয়, তাই আমি এটি সম্পর্কে খুব বেশি চিন্তা করি না।

পাইথন 3 কেবলমাত্র নতুন স্টাইলের ক্লাসগুলির সম্পর্কে জানে (আপনি উদ্ভূত হন objectবা না হন তা নয়)।


37

উভয়

SuperClass.__init__(self, x)

অথবা

super(SubClass,self).__init__( x )

কাজ করবে (আমি ডিআরআই পছন্দ করি, কারণ এটি ডিআরওয়াই নীতিটির আরও মেনে চলে)

এখানে দেখুন: http://docs.python.org/references/datamodel.html#basic- কাস্টমাইজেশন


8
ভুল। সুপার কেবলমাত্র নতুন-স্টাইলের ক্লাসগুলির সাথে কাজ করে এবং নতুন স্টাইলের ক্লাসগুলি ব্যবহার করার সময় বেসকে কল করার একমাত্র সঠিক উপায়। তদ্ব্যতীত, আপনাকে পুরানো-স্টাইলের কনস্ট্রাক্টটি স্পষ্টভাবে 'স্ব' পাস করতে হবে।
আইভো ভ্যান ডের উইজক

1
@ আইভো - উদাহরণটিতে ওপি একটি নতুন-স্টাইলের ক্লাস দিয়েছে এবং নতুন স্টাইল এবং পুরানো স্টাইলের মধ্যে পার্থক্য সম্পর্কে কথা বলার সামান্য কারণ আছে কারণ আর কাউকে আর পুরানো স্টাইল ব্যবহার করা উচিত নয়। আমি যে লিঙ্কটি দিয়েছি (পাইথন ডক্সে) সুপারিশ করে যে সুপার-ক্লাসে কল করার একাধিক "যথাযথ" উপায় নেই __init__
adamk


21

বেস (সুপার) ক্লাসটি কীভাবে শুরু করব?

class SuperClass(object):
    def __init__(self, x):
        self.x = x

class SubClass(SuperClass):
    def __init__(self, y):
        self.y = y

superপদ্ধতি সমাধানের ক্রমে আপনি পরবর্তী পদ্ধতিটি (সীমাবদ্ধ পদ্ধতি হিসাবে) পান তা নিশ্চিত করতে একটি অবজেক্ট ব্যবহার করুন । পাইথন 2 এ, আপনাকে selfবাউন্ড __init__পদ্ধতিটি দেখার জন্য শ্রেণীর নাম এবং সুপার পাস করতে হবে :

 class SubClass(SuperClass):
      def __init__(self, y):
          super(SubClass, self).__init__('x')
          self.y = y

পাইথন 3-তে একটি সামান্য যাদু রয়েছে যা যুক্তিগুলিকে superঅপ্রয়োজনীয় করে তোলে - এবং পার্শ্ব সুবিধা হিসাবে এটি আরও দ্রুত কাজ করে:

 class SubClass(SuperClass):
      def __init__(self, y):
          super().__init__('x')
          self.y = y

নীচের মত পিতামাতাকে হার্ডকোডিং আপনাকে সমবায় একাধিক উত্তরাধিকার ব্যবহার থেকে বাধা দেয়:

 class SubClass(SuperClass):
      def __init__(self, y):
          SuperClass.__init__(self, 'x') # don't do this
          self.y = y

দ্রষ্টব্য যে __init__কেবল ফিরে আসতে পারেNone - এটি উদ্দেশ্য জায়গায় স্থান পরিবর্তন করার উদ্দেশ্যে।

কিছু __new__

উদাহরণগুলি আরম্ভ করার জন্য আরও একটি উপায় রয়েছে - এবং পাইথনের অপরিবর্তনীয় ধরণের সাবক্লাসগুলির জন্য এটি একমাত্র উপায়। যদি আপনি উপশ্রেণী করতে চান সুতরাং এটি এর প্রয়োজন strবা tupleবা অন্য অপরিবর্তনীয় অবজেক্ট।

আপনি সম্ভবত এটি একটি শ্রেণিবদ্ধ বলে মনে করতে পারেন কারণ এটি একটি অন্তর্নিহিত শ্রেণি আর্গুমেন্ট পায়। তবে এটি আসলে একটি অচলিত ধারণা । আপনাকে কল করার প্রয়োজন তাই __new__সঙ্গেcls স্পষ্টভাবে।

আমরা সাধারণত উদাহরণটি থেকে ফিরে আসি __new__, সুতরাং আপনি যদি তা করেন তবে আপনাকে আপনার বেস শ্রেণীর __new__মাধ্যমে আপনার বেসের মাধ্যমেও কল করতে হবে super। সুতরাং আপনি যদি উভয় পদ্ধতি ব্যবহার করেন:

class SuperClass(object):
    def __new__(cls, x):
        return super(SuperClass, cls).__new__(cls)
    def __init__(self, x):
        self.x = x

class SubClass(object):
    def __new__(cls, y):
        return super(SubClass, cls).__new__(cls)

    def __init__(self, y):
        self.y = y
        super(SubClass, self).__init__('x')

পাইথন 3 __new__স্ট্যাটিক পদ্ধতি হওয়ার কারণে সুপার কলগুলির অদ্ভুততার কিছুটা অংশ অতিক্রম করে, তবে আপনাকে এখনও clsঅ-আবদ্ধ __new__পদ্ধতিতে যেতে হবে:

class SuperClass(object):
    def __new__(cls, x):
        return super().__new__(cls)
    def __init__(self, x):
        self.x = x

class SubClass(object):
    def __new__(cls, y):
        return super().__new__(cls)
    def __init__(self, y):
        self.y = y
        super().__init__('x')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.