Type-Hinting Child class 返回自我
Type-Hinting Child class returning self
是否有任何方法可以键入抽象父 class 方法,使子 class 方法为 return 本身所知,而不是抽象父方法。
class Parent(ABC):
@abstractmethod
def method(self) -> [what to hint here]:
pass
class Child1(Parent)
def method(self):
pass
def other_method(self):
pass
class GrandChild1(Child1)
def other_method_2(self):
pass
这更多是为了改进 PyCharm 或 VScode 的 python 插件等 IDE 的自动完成功能。
因此,文档中描述了一般方法 here
import typing
from abc import ABC, abstractmethod
T = typing.TypeVar('T', bound='Parent') # use string
class Parent(ABC):
@abstractmethod
def method(self: T) -> T:
...
class Child1(Parent):
def method(self: T) -> T:
return self
def other_method(self):
pass
class GrandChild1(Child1):
def other_method_2(self):
pass
reveal_type(Child1().method())
reveal_type(GrandChild1().method())
而 mypy
给我们:
test_typing.py:22: note: Revealed type is 'test_typing.Child1*'
test_typing.py:23: note: Revealed type is 'test_typing.GrandChild1*'
请注意,我必须继续使用类型变量才能使其正常工作,因此当我最初尝试在子 class 注释中使用实际的子 class 时,它(错误地? ) 继承了孙子中的类型:
class Child1(Parent):
def method(self) -> Child1:
return self
我会用 mypy:
test_typing.py:22: note: Revealed type is 'test_typing.Child1'
test_typing.py:23: note: Revealed type is 'test_typing.Child1'
同样,我不确定这是否是 expected/correct 行为。 mypy documentation 当前有一个警告:
This feature is experimental. Checking code with type annotations for
self arguments is still not fully implemented. Mypy may disallow valid
code or allow unsafe code.
是否有任何方法可以键入抽象父 class 方法,使子 class 方法为 return 本身所知,而不是抽象父方法。
class Parent(ABC):
@abstractmethod
def method(self) -> [what to hint here]:
pass
class Child1(Parent)
def method(self):
pass
def other_method(self):
pass
class GrandChild1(Child1)
def other_method_2(self):
pass
这更多是为了改进 PyCharm 或 VScode 的 python 插件等 IDE 的自动完成功能。
因此,文档中描述了一般方法 here
import typing
from abc import ABC, abstractmethod
T = typing.TypeVar('T', bound='Parent') # use string
class Parent(ABC):
@abstractmethod
def method(self: T) -> T:
...
class Child1(Parent):
def method(self: T) -> T:
return self
def other_method(self):
pass
class GrandChild1(Child1):
def other_method_2(self):
pass
reveal_type(Child1().method())
reveal_type(GrandChild1().method())
而 mypy
给我们:
test_typing.py:22: note: Revealed type is 'test_typing.Child1*'
test_typing.py:23: note: Revealed type is 'test_typing.GrandChild1*'
请注意,我必须继续使用类型变量才能使其正常工作,因此当我最初尝试在子 class 注释中使用实际的子 class 时,它(错误地? ) 继承了孙子中的类型:
class Child1(Parent):
def method(self) -> Child1:
return self
我会用 mypy:
test_typing.py:22: note: Revealed type is 'test_typing.Child1'
test_typing.py:23: note: Revealed type is 'test_typing.Child1'
同样,我不确定这是否是 expected/correct 行为。 mypy documentation 当前有一个警告:
This feature is experimental. Checking code with type annotations for self arguments is still not fully implemented. Mypy may disallow valid code or allow unsafe code.