如何在Python类型提示中表达多重继承?

28 人关注

在Java、C#中,一个泛型方法可以有一个带约束的类型参数来定义必须实现的接口。

static <T extends Iterable<Integer> & Comparable<Integer>> void test(T p) {

在Python中,如果我想用类型提示来指定一个变量必须继承类A和类B,我怎样才能做到?我检查了打字模块,它只有一个Union,这意味着变量的类型可以是提示中的任何一个,而不是所有的提示。

创建一个继承了A和B的新类C,似乎是一个解决方案,但看起来很麻烦。

5 个评论
如果有一个继承自A和B的类,那么你应该把这个类放在那里。这是一个类型提示,不是一个继承提示。
有多个类可以继承A和B,比如T1(A, B, C), T2(A, B, D)。然后我定义一个函数,其参数必须继承A和B:"def func(obj)"。我想用类型提示来显示这个要求。
那么这个要求不是一个类型。你应该记住,与 Java 和 C 不同,Python 不是一种静态类型的语言。它使用鸭子类型的概念。所以这些类型 hints 与Java中的接口不同的目的。它们主要是用于文档和IDE功能,如自动建议。
如果不支持这一点,看起来会很奇怪。打字模块中的联盟可以表达 "任何",而 "所有 "不能表达?
python
python-typing
Alex Lee
Alex Lee
发布于 2018-10-11
1 个回答
Kuldeep Pal
Kuldeep Pal
发布于 2020-07-12
已采纳
0 人赞同

该类定义等同于。

class MyIter(Iterator[T], Generic[T]):

你可以用Generic使用多个继承。

from typing import TypeVar, Generic, Sized, Iterable, Container, Tuple
T = TypeVar('T')
class LinkedList(Sized, Generic[T]):
K = TypeVar('K')
V = TypeVar('V')
class MyMapping(Iterable[Tuple[K, V]],
                Container[Tuple[K, V]],
                Generic[K, V]):

不指定类型参数的泛型类的子类假定每个位置都是Any。在下面的例子中,MyIterable不是泛型,而是隐含地继承于Iterable[Any]。

from typing import Iterable