Abstract base class 在 abstractmethods 中使用 subclass 的类型
Abstract base class using type of subclass in abstractmethods
我想用一个抽象方法创建一个抽象基础 class,return 是实现该接口的任何子 class 的一个实例。除了我在下面创建的方法之外,是否有更 pythonic 的方法来为 mypy 实现此目的?
在我的代码示例中,我将 Animal
class 设为泛型。 Subclasses 可以继承自 Animal 并将泛型参数指定为其自身,但对我来说这似乎笨拙且错误。我想我可能遗漏了一些明显的东西。
请注意,在下面的代码中,当我 subclass Animal
时,class 定义使用类似 Dog(Animal["Dog"])
的内容。它看起来不适合我,但它适用于类型检查。有没有办法为抽象方法指示它必须 return 与 self
相同的类型?
import abc
from typing import Generic, TypeVar
from __future__ import annotations
T = TypeVar('T')
class Animal(abc.ABC, Generic[T]):
@abc.abstractmethod
def procreate(self: T, other: T) -> T:
pass
class Dog(Animal["Dog"]):
def procreate(self, other: "Dog"):
return Dog()
class Cat(Animal["Cat"]):
def procreate(self, other: "Cat"):
return Cat()
dog = Dog()
dog.procreate(Cat())
AFAIK 你不需要你的 Animal
class 是 Generic
除非它是某种容器,例如Sequence
,我们可以只对特定方法使用 TypeVar
所以这应该按预期工作
import abc
from typing import TypeVar
from __future__ import annotations
T = TypeVar('T')
class Animal(abc.ABC):
@abc.abstractmethod
def procreate(self: T, other: T) -> T:
pass
class Dog(Animal):
def procreate(self, other: "Dog") -> "Dog":
return Dog()
class Cat(Animal):
def procreate(self, other: "Cat") -> "Cat":
return Cat()
dog = Dog()
dog.procreate(Cat())
mypy
将在最后一行通知错误:
> mypy test.py
test.py:26: error: Argument 1 to "procreate" of "Dog" has incompatible type "Cat"; expected "Dog"
Found 1 error in 1 file (checked 1 source file)
我想用一个抽象方法创建一个抽象基础 class,return 是实现该接口的任何子 class 的一个实例。除了我在下面创建的方法之外,是否有更 pythonic 的方法来为 mypy 实现此目的?
在我的代码示例中,我将 Animal
class 设为泛型。 Subclasses 可以继承自 Animal 并将泛型参数指定为其自身,但对我来说这似乎笨拙且错误。我想我可能遗漏了一些明显的东西。
请注意,在下面的代码中,当我 subclass Animal
时,class 定义使用类似 Dog(Animal["Dog"])
的内容。它看起来不适合我,但它适用于类型检查。有没有办法为抽象方法指示它必须 return 与 self
相同的类型?
import abc
from typing import Generic, TypeVar
from __future__ import annotations
T = TypeVar('T')
class Animal(abc.ABC, Generic[T]):
@abc.abstractmethod
def procreate(self: T, other: T) -> T:
pass
class Dog(Animal["Dog"]):
def procreate(self, other: "Dog"):
return Dog()
class Cat(Animal["Cat"]):
def procreate(self, other: "Cat"):
return Cat()
dog = Dog()
dog.procreate(Cat())
AFAIK 你不需要你的 Animal
class 是 Generic
除非它是某种容器,例如Sequence
,我们可以只对特定方法使用 TypeVar
所以这应该按预期工作
import abc
from typing import TypeVar
from __future__ import annotations
T = TypeVar('T')
class Animal(abc.ABC):
@abc.abstractmethod
def procreate(self: T, other: T) -> T:
pass
class Dog(Animal):
def procreate(self, other: "Dog") -> "Dog":
return Dog()
class Cat(Animal):
def procreate(self, other: "Cat") -> "Cat":
return Cat()
dog = Dog()
dog.procreate(Cat())
mypy
将在最后一行通知错误:
> mypy test.py
test.py:26: error: Argument 1 to "procreate" of "Dog" has incompatible type "Cat"; expected "Dog"
Found 1 error in 1 file (checked 1 source file)