gpt4 book ai didi

c# - 参数在 Python 中可以是反变的还是协变的?

转载 作者:行者123 更新时间:2023-11-28 22:51:57 25 4
gpt4 key购买 nike

我刚刚研究了静态语言(更具体地说是 C#)中的协变和逆变。这个概念对我来说相当清楚,但是我怀疑它如何应用于 Python 等动态语言。

由于 Python 是鸭子类型(或结构类型),在我看来,这种语言甚至没有方差和协方差的概念?

如果我没记错的话,像 C# 这样的语言会在编译时检查逆变和协变之类的东西,这是可能的,因为变量有类型,它绑定(bind)的值也有类型,这些必须匹配或是 co(ntra)- 或不变的。但是,由于没有在编译时使用像 Python 这样的语言进行键入的概念,我不知道如何应用这个概念。

有什么想法吗?

我的想法:协变性的概念意味着每当我们期望 X 的类型时,X 的任何子类也会如此。所以,在 Python 中这不会出现,因为没有类型检查来执行此操作。唯一发生的检查是对象是否通过方法和属性具有必要的实现。

例如在 C# 中我们有一个方法:

void DoStuff(Person p)
{
p.Dance();
};

我们可以很好地使用 Student 的实例调用此方法(如果这是 Person 的子类)。

现在,在 Python 中,我们可以很好地传入一个在继承层次结构中与 Person 没有任何关系的 Bird 对象(除非它也继承自 object),只要这个 bird 实现了 舞蹈()

这就是为什么我要问这个概念。据我了解,Python 在……方面是协变和逆变的。好吧,一切?

最佳答案

实际上,这并不完全是(我的理解)方差。差异与类型构造函数 的行为有关,例如 C# 中的泛型。使用 Student代替 Person是普通的子类型。使用 List<Student>代替 Lis<Person>是主题或协变和逆变。

至于实际问题:嗯,Python 没有静态类型系统,因此没有像类型构造函数这样的概念。语言根本不关心这些事情。它会继续并允许您传递任何值,如果它有效,那就太好了。

然而,方差的概念在任何具有子类型和非原子值效果的语言中都非常有用。例如,虽然没有 List<Person> ,你可能(不告诉语言,因为语言甚至没有开始考虑这些事情)建立一些不变量:

  • 一些 list students必须仅包含 Student对象(或隐式符合 Person 接口(interface)的对象,为了鸭子类型)。
  • 一些功能print_persons必须给出 Person 的列表对象并只读取它
  • 一些功能add_person必须给出 Person 的列表对象并添加到它

使用与静态语言相同的推理,您可以看到 print_persons(students)add_person(students) 时是正确的可能不正确。

关于c# - 参数在 Python 中可以是反变的还是协变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21023176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com