在super()方法中调用重写的子方法

时间:2019-09-25 20:49:18

标签: python inheritance micropython

我需要有关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,在任何情况下都不应该这样。

1 个答案:

答案 0 :(得分:1)

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

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