【发布时间】: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() 时说c 是None,无论如何都不应该这样。
【问题讨论】:
-
你不能调用
B.callMe(),因为它是一个实例方法,需要一个对象objB = B()。如果你打电话给objB.callMe()它应该打印'b' -
确实打印了“b”。 Example
-
Ofc,我不直接在课堂上调用它,我这样写是为了简短。我将用真实示例进行更新,以便您了解我需要如何使用它。
-
重写方法的全部意义在于它应该优先,即使从父类调用也是如此。这允许您在父级中编写通用代码并将详细信息委托给子级。
标签: python inheritance micropython