【问题标题】:Strange inheritance during the override of a method方法覆盖期间的奇怪继承
【发布时间】:2020-02-15 04:15:50
【问题描述】:

我正在开发相互继承的不同对象。
有一次,我注意到超级方法的代码仍然由继承的方法执行。
从下面列出的子方法可以看出,我注释了super(),以防止超类代码被执行。
这是超类:

class superClass(superClassOfSuperClass):
    def __init__(self, data):
        #[...]

        #unique call of the superMethod
        self.component.addActionListener(self.superMethod)

        #[...]

    def superMethod(self, param):
        print "I'm executed, but I don't have to be executed!"

这是子方法:

class subClass(superClass):
    def __init__(self, data, newData):
        superClass.__init__(self, data)
        self.newData = newData

        #[...]

    def superMethod(self, param):
        #super(superClass, self).superMethod(None)
        print 'only I have to be printed!!!'

代码有效。 但我不想看到superMethod 打印。

有没有办法阻止 superMethod 运行并使 subMethod 只执行? 因为到目前为止我可以看到两个打印输出。
我希望这是我在 OOP 上的不足。

PS:正如您从标签中看到的那样,我正在使用 Jython 2.7。

【问题讨论】:

  • 您的呼叫站点是什么样的?顺便说一句,superMethodsubMethod 是不同的名称,通常不会相互覆盖..
  • 已更正。该调用实际上是在超类中进行的。是这个原因吗?我应该重写子类的__init__吗?
  • 您的呼叫站点是什么样的?
  • 是超类的__ init__。我称之为:self.component.addActionListener(self.superMethod) 这是我唯一调用 superMethod 的站点
  • 好的,这很有趣。请使用此新信息更新问题。事实上,请同时显示 __init__ 方法。

标签: python python-2.7 jython jython-2.7


【解决方案1】:

必须有另一种解释,例如,如果涉及更多类,并且有另一个类继承自superClass,但没有覆盖superMethod

以下代码(我使用的是 python 3)表明一切正常:

class Super:
    def __init__(self, listener):
        listener.append(self.superMethod)

    def superMethod(self, param):
        print("I'm executed, but I don't have to be executed!")


class Sub(Super):
    def superMethod(self, param):
        print('Only me!')

methods = []
s = Sub(methods)

for method in methods:
    method(None)

输出:

Only me!

【讨论】:

  • 我相信您正在调用类外的方法。我想要做的是覆盖一个已经在超类中分配的方法(这是我以前做过的事情)。我将尝试删除旧方法,并通过以另一种方式调用它来放置新方法...
  • 我已经向您询问了呼叫站点,但您没有提供,所以在我的问题中,我必须自己制作一个。我们的超类都没有在它们的__init__ 方法中调用它们自己的任何方法
  • 当然没有调用,我从不直接调用(例如:self.method(None)),但它是一个监听器。它仅在用户对 UI 执行操作时激活。尽管如此,它并没有完全覆盖。
  • 好吧,UI 会像我在回答中模拟的那样进行调用。它在 Python 3 中运行良好。也许在 Jython 2.7 中有一些不同的工作方式。也许您可以在 Jython 中尝试我的代码。
  • 你的解决方案是对的。我看到这些输出是因为它们是由其他对象调用的,而不是由相关对象调用的……愚蠢的我!然而,这让我有机会提交我想要的最好的代码,同时也学习新事物! :)
猜你喜欢
  • 2012-11-20
  • 2016-06-04
  • 2016-01-25
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
相关资源
最近更新 更多