بيثون باستخدام طريقة الفئة المشتقة في فئة الوالدين؟

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

سؤال

هل يمكنني إجبار فئة أولياء الأمور على استدعاء إصدار فئة مشتقة من وظيفة؟

class Base(object):
    attr1 = ''
    attr2 = ''

    def virtual(self):
        pass               # doesn't do anything in the parent class

    def func(self):
        print "%s, %s" % (self.attr1, self.attr2)
        self.virtual()

وفئة مستمدة منه

class Derived(Base):
    attr1 = 'I am in class Derived'
    attr2 = 'blah blah'

    def virtual(self):
        # do stuff...
        # do stuff...

تطهير الغموض:

d = Derived()
d.func()         # calls self.virtual() which is Base::virtual(), 
                 #  and I need it to be Derived::virtual()
هل كانت مفيدة؟

المحلول

إذا قمت بتسوية أ Derived (قل d = Derived())، ال .virtual هذا يسمى من قبل d.func() هو Derived.virtual. إذا لم يكن هناك مثال Derived متورط ، ثم ليس هناك مناسبة self إلى عن على Derived.virtual وبالطبع من المستحيل تسميته.

نصائح أخرى

هذا ليس مستحيلًا - هناك طريقة للتغلب على هذا في الواقع ، وليس عليك أن تمر في الوظيفة أو أي شيء من هذا القبيل. أنا أعمل في مشروع بنفسي حيث ظهرت هذه المشكلة بالضبط. هذا هو الحل:


class Base(): # no need to explicitly derive object for it to work
    attr1 = 'I am in class Base'
    attr2 = 'halb halb'

    def virtual(self):
        print "Base's Method"

    def func(self):
        print "%s, %s" % (self.attr1, self.attr2)
        self.virtual()

class Derived(Base):
    attr1 = 'I am in class Derived'
    attr2 = 'blah blah'

    def __init__(self):
  # only way I've found so far is to edit the dict like this
        Base.__dict__['_Base_virtual'] = self.virtual

    def virtual(self):
        print "Derived's Method"

if __name__ == '__main__':
    d = Derived()
    d.func()

حسنًا ، لقد انتهيت للتو من تمرير مثيل Virtual () كنت بحاجة إلى Func ()

class Base(object):
    attr1 = ''
    attr2 = ''

    def __init__(self):
        pass

    def virtual(self):
        pass

    def func(self, cb):
         print "%s, %s" % (self.attr1, self.attr2)
         cb()

class Derived(Base):
    attr1 = 'I am in class Derived'
    attr2 = 'blah blah'

    def virtual(self):
        # do stuff...
        # do stuff...


d = Derived()
d.func(d.virtual)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top