【问题标题】:How to express multiple inheritance in Python type hint?如何在 Python 类型提示中表达多重继承?
【发布时间】:2019-03-16 04:45:37
【问题描述】:

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

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

}

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

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

【问题讨论】:

  • 如果有一个类继承自 A 和 B,那么你应该把那个类放在那里。这是一个类型提示,而不是继承提示。
  • 多个类可以继承A和B,如T1(A, B, C), T2(A, B, D)。然后我定义了一个函数,它的参数必须继承A和B:“def func(obj)”。我想使用类型提示来显示这个要求。
  • 嗯,需求不是类型。您应该记住,与 Java 和 C 不同,Python 不是静态类型语言。它使用鸭式打字的概念。因此,这些类型 hints 的用途与 Java 中的接口不同。它们主要用于文档和 IDE 功能,例如自动建议。
  • 如果不支持它会看起来很奇怪。打字模块中的union可以表示“any”,而“all”不能表示?

标签: python python-typing


【解决方案1】:

该类定义等价于:

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

class MyIterable(Iterable):  # Same as Iterable[Any]
    ...

不支持通用元类。

【讨论】:

    猜你喜欢
    • 2023-02-24
    • 2018-08-24
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多