Вызов переопределенного под-метода внутри метода super () - PullRequest
0 голосов
/ 25 сентября 2019

Мне нужна помощь относительно метода 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()говорит, что c - это None, чего не должно быть, в любом случае.

1 Ответ

1 голос
/ 26 сентября 2019

решаемая.Я забыл печально известный return из super().Код:

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