今天我深入研究了利斯科夫的替代原理和协方差/逆变换
我被以下两者的区别所困扰:
T = TypeVar("T", bound=Union[A, B])
T = TypeVar("T", A, B, covariant=True)
我对#1的理解
Difference between TypeVar('T', A, B) and TypeVar('T', bound=Union[A, B])
This answer明确指出T
可以是:
Union[A, B]
(or a union of any subtypes ofA
andB
such asUnion[A, BChild]
)A
(or any subtype ofA
)B
(or any subtype ofB
)
这对我来说很有意义
我对#2的理解有缺陷
再次提到了bound=Union[A, B]
案例,但没有理解选项2 A, B, covariant=True
的含义
我试过玩弄mypy
,但似乎弄不明白。
有人能指出这是什么意思吗?
我认为这意味着:
A
(或A
的任何亚型)B
(或B
的任何亚型)(也就是说,它排除了上述Union
案例)
**编辑**
评论中有人问:
Are you sure that they're actually different?
下面是显示差异的示例代码。错误来自mypy==0.770
from typing import Union, TypeVar, Generic
class A: pass
class ASub(A): pass
class B: pass
# Case 1... Success: no issues found
# T = TypeVar("T", bound=Union[A, B])
# Case 2... error: Value of type variable "T" of "SomeGeneric" cannot be "ASub"
T = TypeVar("T", A, B, covariant=True)
class SomeGeneric(Generic[T]): pass
class SomeGenericASub(SomeGeneric[ASub]): pass
**编辑2**
这消除了我的一些误解。事实证明TypeVar("T", A, B, covariant=True)
并不正确,因为知道值限制A
和B
实际上并不协变
使用covariant=True
语法只有在它们相关时才有用
协方差和反方差是与对象定向和泛型之间的交集相关的术语
这是这个概念试图回答的问题:
Base
和Derived
李>List<T>
李>List<Derived>
可以在List<Base>
可以使用的任何地方使用李>List<Base>
可以在任何地方使用List<Derived>
李>如果(3)的答案是肯定的,它被称为协方差,我们将说
List
声明为covariance=True
。如果(4)的答案为真,则称为“反向方差”。如果没有一个是真的,它是不变的边界也来自OO和泛型的交叉点。当我们定义泛型类型MyType时,是否意味着“T”可以是任何类型?或者,我可以对T的可能形式施加一些限制吗?边界允许我声明T的上界是,例如,类
Derived
。在这种情况下,Base
不能与'MyType'一起使用,但是Derived
及其所有子类都可以协方差和反方差的定义见this section of PEP-484
相关问题 更多 >
编程相关推荐