python - استدعاء طريقة فئة الوالدين من فئة الطفل في بيثون؟




inheritance class (8)

عند إنشاء تسلسل هرمي كائن بسيط في Python ، أريد أن أكون قادرًا على استدعاء أساليب الفئة الأصل من فئة مكتسبة. في Perl و Java ، توجد كلمة أساسية لهذا (super). في بيرل ، قد أفعل هذا:

package Foo;

sub frotz {
    return "Bamf";
}

package Bar;
@ISA = qw(Foo);

sub frotz {
   my $str = SUPER::frotz();
   return uc($str);
}

في python ، يبدو أنه يجب علي تسمية الفئة الأصل بشكل صريح من الطفل. في المثال أعلاه ، يجب أن أفعل شيئًا مثل Foo :: frotz ().

لا يبدو هذا صحيحًا ، نظرًا لأن هذا السلوك يجعل من الصعب إنشاء تسلسلات هرمية عميقة. إذا كان الأطفال بحاجة إلى معرفة ما هو تعريف الطبقة وسيلة موروثة ، ثم يتم إنشاء جميع أنواع ألم المعلومات.

هل هذا الحد الفعلي في الثعبان ، فجوة في فهمي أو كليهما؟


أوصي باستخدام CLASS.__bases__ شيء من هذا القبيل

class A:
   def __init__(self):
        print "I am Class %s"%self.__class__.__name__
        for parentClass in self.__class__.__bases__:
              print "   I am inherited from:",parentClass.__name__
              #parentClass.foo(self) <- call parents function with self as first param
class B(A):pass
class C(B):pass
a,b,c = A(),B(),C()


في Python 2 ، لم يكن لدي الكثير من الحظ مع super (). اعتدت على الإجابة من jimifiki على هذا الموضوع حتى كيفية الرجوع إلى طريقة الوالدين في بيثون؟ . بعد ذلك ، أضفت لي بعض التحولات الخاصة بها ، والتي أعتقد أنها تحسن في قابليتها للاستخدام (خاصة إذا كان لديك أسماء طويلة للفصول الدراسية).

قم بتعريف الفئة الأساسية في وحدة نمطية واحدة:

 # myA.py

class A():     
    def foo( self ):
        print "foo"

ثم قم باستيراد الفصل إلى وحدات نمطية أخرى كالأم:

# myB.py

from myA import A as parent

class B( parent ):
    def foo( self ):
        parent.foo( self )   # calls 'A.foo()'

لدى Python 3 بنية مختلفة وأبسط لاستدعاء الطريقة الأصل. إذا كان يرث درجة Foo من Bar ، Bar.__init__ عندئذٍ من Bar.__init__ التذرع بـ Foo باستخدام super().__init__() :

class Foo(Bar):
    def __init__(self):
        super().__init__()

نعم ، ولكن مع فئات جديدة فقط. استخدم الدالة super() :

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)

هذه طريقة أكثر تجريدًا:

super(self.__class__,self).baz(arg)

هناك سوبر () في بايثون أيضا. إنه أمر غير واضح بعض الشيء ، بسبب فصول بيثون القديمة والجديدة ، ولكنه شائع الاستخدام على سبيل المثال في المنشئات:

class Foo(Bar):
    def __init__(self):
        super(Foo, self).__init__()
        self.baz = 5

هناك سوبر () في بيثون أيضا.

مثال لكيفية استدعاء طريقة الطبقة الفائقة من طريقة فئة فرعية

class Dog(object):
    name = ''
    moves = []

    def __init__(self, name):
        self.name = name

    def moves_setup(self,x):
        self.moves.append('walk')
        self.moves.append('run')
        self.moves.append(x)
    def get_moves(self):
        return self.moves

class Superdog(Dog):

    #Let's try to append new fly ability to our Superdog
    def moves_setup(self):
        #Set default moves by calling method of parent class
        super().moves_setup("hello world")
        self.moves.append('fly')
dog = Superdog('Freddy')
print (dog.name)
dog.moves_setup()
print (dog.get_moves()) 

هذا المثال مشابه للواحد الموضح أعلاه. ومع ذلك ، هناك فارق واحد أن السوبر لا يمتلك أي حجج يتم تمريرها إليه. هذه الشفرة المذكورة أعلاه قابلة للتنفيذ في الإصدار 3.4 python.







object