【发布时间】:2020-07-23 13:31:18
【问题描述】:
我有一个基类,其方法返回时的类型提示为 float。
在子类中,如果不重新定义签名,我可以以某种方式将方法返回的类型提示更新为int吗?
示例代码
#!/usr/bin/env python3.6
class SomeClass:
"""This class's some_method will return float."""
RET_TYPE = float
def some_method(self, some_input: str) -> float:
return self.RET_TYPE(some_input)
class SomeChildClass(SomeClass):
"""This class's some_method will return int."""
RET_TYPE = int
if __name__ == "__main__":
ret: int = SomeChildClass().some_method("42"). #
ret2: float = SomeChildClass().some_method("42")
我的 IDE 抱怨类型不匹配:
发生这种情况是因为我的 IDE 仍在使用来自 SomeClass.some_method 的类型提示。
研究
我认为解决方案可能是使用泛型,但我不确定是否有更简单的方法。
Python: how to override type hint on an instance attribute in a subclass?
建议可能使用instance variable annotations,但我不确定如何为返回类型执行此操作。
【问题讨论】:
-
我认为这不可能,因为在您的情况下,只有一个
some_method(SomeClass上定义的那个)。SomeChildClass的实例会将方法名称解析为在SomeClass上定义的同一个函数对象,它们实际上没有自己的单独实现,您可以单独注释。注解只是函数对象上的一个属性,它不能真正有不同的注解,具体取决于它是如何通过 MRO 解决的。 -
啊,这很有道理@wim,谢谢你的回复。您对更新子类(
SomeChildClass)中的注释的最简单方法有什么想法吗? -
嗯,最简单的方法:与其做
RET_TYPE = float类属性的事情,不如在子类中重新定义方法? -
添加到对话中:如果您将行更改为 def some_method(self, some_input: str) -> RET_TYPE: (因此将 'float' 类型提示替换为 'RET_TYPE' 提示,然后视图中的错误指示消失了(不幸的是,不在 main 中),至少在我的 PyCharm 中。显然 PyCharm 足够聪明,可以发现每次调用的 RET_TYPE 都不同。
标签: python oop type-hinting method-signature