【问题标题】:Calling overriden sub-method inside super() method在 super() 方法中调用重写的子方法
【发布时间】:2019-09-25 20:49:18
【问题描述】:

我需要一些关于 super() 方法的帮助。 考虑这个例子:

class A:
    def subMethod(self):
        return "a"
    def callMe(self):
        print(self.subMethod())

class B(A):
    def subMethod(self):
        return "b"
    def callMe(self):
        print("Look at me")
        super().callMe()

现在,如果我打电话给B.callMe(),它会打印出a。我希望它打印b 我该如何解决这个问题?有可能吗?

至于细节,我在MicroPython平台上使用这个代码,所以我在使用一些高级库时受到限制,因为它只包含几个标准库。

这是一个真实的例子:

class UARTbase():
    def readLine(self):
        pass

    def readWithSign(self):
        c = self.readLine()
        self.printDebug("raw")
        self.printDebug(c)
        c = c.decode()
        self.printDebug("decoded")
        self.printDebug(c)
        self.writeNoAck(c)
        return c


class UARTesp(UARTbase):
    def disableTermDecorator(func):
        def aFunc(self, *args, **kwargs):
            return_value = None
            if(self.__term_count == 0):
                uos.dupterm(None, 1)
                self.getUart().init(timeout=self.TIMEOUT)
            self.__term_count = self.__term_count + 1
            try:
                return_value = func(self, *args, **kwargs)
            except Exception as e:
                self.printDebug("Error in wrapper")
                self.printDebug(e)
            self.__term_count = self.__term_count - 1
            if(self.__term_count == 0):
                self.getUart().init(timeout=0)
                uos.dupterm(self.getUart(), 1)
            return return_value
        gc.collect()
        return aFunc


    @disableTermDecorator
    def readLine(self, *args, **kwargs):
        c = self.getUart().readline()
        if(c is not None):
            return c[:-2]
        # for compatibilty
        return b''

    @disableTermDecorator
    def readWithSign(self, *args, **kwargs):
        super().readWithSign(*args, **kwargs)

如你所见,我只需要调用super,所以我可以用这个特定的装饰器包装方法。

当我打电话给super().readWithSign() 时说cNone,无论如何都不应该这样。

【问题讨论】:

  • 你不能调用B.callMe(),因为它是一个实例方法,需要一个对象objB = B()。如果你打电话给objB.callMe() 它应该打印'b'
  • 确实打印了“b”。 Example
  • Ofc,我不直接在课堂上调用它,我这样写是为了简短。我将用真实示例进行更新,以便您了解我需要如何使用它。
  • 重写方法的全部意义在于它应该优先,即使从父类调用也是如此。这允许您在父级中编写通用代码并将详细信息委托给子级。

标签: python inheritance micropython


【解决方案1】:

解决了。我从super() 忘记了臭名昭著的return。 代码:

    @disableTermDecorator
    def readWithSign(self, *args, **kwargs):
        return super().readWithSign(*args, **kwargs)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2017-07-07
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    相关资源
    最近更新 更多