Python在父类中使用派生类的方法?

11 python inheritance new-style-class

我可以强制父类调用派生类的函数版本吗?

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()
Run Code Online (Sandbox Code Playgroud)

以及从中衍生出来的一类

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

    def virtual(self):
        # do stuff...
        # do stuff...
Run Code Online (Sandbox Code Playgroud)

清除模糊:

d = Derived()
d.func()         # calls self.virtual() which is Base::virtual(), 
                 #  and I need it to be Derived::virtual()
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 9

如果你实例化一个Derived(比如说d = Derived()),.virtual那个被调用的d.func() Derived.virtual.如果没有Derived涉及的实例,则没有适合selfDerived.virtual,所以当然不可能称之为.

  • 保罗,你所说的不可能发生(用你展示的代码).运行您显示的代码,使用`print'这是Derived.virtual!"`作为`Derived.virtual`的主体,当然会打印出这个字符串(在"我在类Derived,blah blah`字符串之后)课程).您的错误必须在您未显示的代码的其他部分. (2认同)

Jya*_*aan 5

这并非不可能-实际上有一种解决方法,您不必传递函数或类似的东西。我自己正在一个项目中解决这个确切的问题。解决方法如下:


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()

Run Code Online (Sandbox Code Playgroud)