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

Posted

技术标签:

【中文标题】Python在父类中使用派生类的方法?【英文标题】:Python using derived class's method in parent class? 【发布时间】:2011-01-18 20:43:27 【问题描述】:

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

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

【问题讨论】:

抱歉,把问题改得不那么含糊了 使用 python 2.6.4 并将 print 放入派生的 virtual - 它使用派生的虚拟函数 - 而不是 Base 是什么让你认为它在调用 Base::virtual()? 【参考方案1】:

如果您实例化一个Derived(例如d = Derived()),则d.func() 调用的.virtual Derived.virtual。如果没有涉及到Derived 的实例,那么Derived.virtual 就没有合适的self,所以当然不可能调用它。

【讨论】:

你的权利当然……又太快了。这几天经常发生在我身上;-( 我更改了问题以更好地解释我的意思 保罗,你所说的不可能发生(使用你显示的代码)。运行您显示的代码,使用print "this is Derived.virtual!" 作为Derived.virtual 的主体,当然会打印出这个字符串(当然是在I am in class Derived, blah blah 字符串之后)。您的错误必须在您未显示的代码的其他部分中。【参考方案2】:

这并非不可能——实际上有一种解决方法,您不必传入函数或类似的东西。我自己正在做一个项目,这个确切的问题出现了。这是解决方案:


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

【讨论】:

以上是关于Python在父类中使用派生类的方法?的主要内容,如果未能解决你的问题,请参考以下文章

获取派生类以显示与派生类的父类具有聚合关系的抽象类中的变量的 C++ 错误

面向对象三大特性

关于C++的虚函数在父类的内部调用

派生类中事件绑定的事件处理函数是类实例方法使其能访问父类和派生类所有数据

面向对象:继承与派生

Python3.7之派生