トリックを明示的にそうように、represent a class rather then the instance itselfに、genericsため、TypeVar
との組み合わせで、cls
パラメータに注釈を追加し、Type
することです:
from typing import TypeVar, Type
# Create a generic variable that can be 'Parent', or any subclass.
T = TypeVar('T', bound='Parent')
class Parent:
def __init__(self, bar: str) -> None:
self.bar = bar
@classmethod
def with_stuff_appended(cls: Type[T], bar: str) -> T:
# We annotate 'cls' with a typevar so that we can
# type our return type more precisely
return cls(bar + "stuff")
class Child(Parent):
# If you're going to redefine __init__, make sure it
# has a signature that's compatible with the Parent's __init__,
# since mypy currently doesn't check for that.
def child_only(self) -> int:
return 3
# Mypy correctly infers that p is of type 'Parent',
# and c is of type 'Child'.
p = Parent.with_stuff_appended("10")
c = Child.with_stuff_appended("20")
# We can verify this ourself by using the special 'reveal_type'
# function. Be sure to delete these lines before running your
# code -- this function is something only mypy understands
# (it's meant to help with debugging your types).
reveal_type(p) # Revealed type is 'test.Parent*'
reveal_type(c) # Revealed type is 'test.Child*'
# So, these all typecheck
print(p.bar)
print(c.bar)
print(c.child_only())
通常は、cls
(とself
を残すことができます)は注釈を付けませんが、特定のサブクラスを参照する必要がある場合は、explicit annotationを追加できます。この機能はまだ実験中であり、場合によってはバグの可能性があることに注意してください。 pypiで利用できるものではなく、Githubからクローン化されたmypyの最新バージョンを使用する必要があるかもしれません。クラスメイトのこの機能をサポートしているかどうかはわかりません。
' - > 'Foo''は正しいです、それはあなたが返す値について強制することができます(またはそうするべきです)。 – jonrsharpe