ما هو مثال أساسي للميراث الفردي باستخدام الكلمة الرئيسية Super () في Python؟

StackOverflow https://stackoverflow.com/questions/1173992

سؤال

دعنا نقول أن لدي الفصول التالية إعداد:

class Foo:
     def __init__(self, frob, frotz):
          self.frobnicate = frob
          self.frotz = frotz
class Bar:
     def __init__(self, frob, frizzle):
          self.frobnicate = frob
          self.frotz = 34
          self.frazzle = frizzle

كيف يمكنني (إذا استطعت على الإطلاق) استخدم Super () في هذا السياق للقضاء على التعليمات البرمجية المكررة؟

هل كانت مفيدة؟

المحلول

في بيثون> = 3.0، مثل هذا:

class Foo():
    def __init__(self, frob, frotz)
        self.frobnicate = frob
        self.frotz = frotz

class Bar(Foo):
    def __init__(self, frob, frizzle)
        super().__init__(frob, 34)
        self.frazzle = frizzle

اقرأ المزيد هنا: http://docs.python.org/3.1/library/functions.htmlsuper.

تحرير: كما قال في إجابة أخرى، في بعض الأحيان فقط باستخدام Foo.__init__(self, frob, 34) يمكن أن يكون الحل الأفضل. (على سبيل المثال، عند العمل مع بعض أشكال الميراث المتعددة.)

نصائح أخرى

على افتراض أنك تريد شريط فئة لتعيين القيمة 34 داخل منشئها، سيعمل ذلك:

class Foo(object):
     def __init__(self, frob, frotz):
          self.frobnicate = frob
          self.frotz = frotz

class Bar(Foo):
     def __init__(self, frob, frizzle):
          super(Bar, self).__init__(frob, frizzle)
          self.frotz = 34
          self.frazzle = frizzle


bar = Bar(1,2)
print "frobnicate:", bar.frobnicate
print "frotz:", bar.frotz
print "frazzle:", bar.frazzle

لكن، super يقدم مضاعفاتها الخاصة. انظر على سبيل المثال تعتبر سوبر ضارا. وبعد للتأكد من اكتمال، إليك الإصدار المكافئ دون super.

class Foo(object):
     def __init__(self, frob, frotz):
          self.frobnicate = frob
          self.frotz = frotz

class Bar(Foo):
     def __init__(self, frob, frizzle):
          Foo.__init__(self, frob, frizzle)
          self.frotz = 34
          self.frazzle = frizzle


bar = Bar(1,2)
print "frobnicate:", bar.frobnicate
print "frotz:", bar.frotz
print "frazzle:", bar.frazzle
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top