【问题标题】:What is the language feature that some kinds of classes are defined in terms of having some methods with special names?根据具有特殊名称的某些方法来定义某些类的语言特征是什么?
【发布时间】:2018-02-26 01:08:24
【问题描述】:

这是一个编程语言概念问题,例如类似于 Scott 的 Programming Language Pragmatics 水平。

在Python中,某些对象的类是根据某些具有特殊名称的方法来定义的,例如,

  1. 描述符类定义为具有名为__get____set____delete__() 的方法的类。
  2. 迭代器类被定义为具有名为__next__ 的方法的类。

问题:

  1. 在编程语言设计中,Python中的语言特性是什么?是鸭子打字吗?
  2. 语言功能在底层是如何工作的?
  3. 在 C++、C# 和 Java 中,描述符的类和 迭代器的类将被定义为一些的子类 特定的课程? (类似于C#接口IDisposable

    在 Python 中,

    • 描述符的类可以定义为某个特定类的子类吗?

    • 可以将迭代器的类定义为某个特定类的子类吗?

【问题讨论】:

  • “一个迭代器的类被定义为一个有一个名为__next__的方法的类” 这是不正确的,或者至少措辞不好。迭代器是具有__next__ 函数的对象。迭代器的类一点也不重要。这是鸭子打字。

标签: python programming-languages computer-science typing


【解决方案1】:

在编程语言设计中,Python 中的语言特性是什么?是鸭子打字吗?

“任何具有特定名称(或签名)成员的对象,都可以在这里工作”是鸭子类型。我认为没有更具体的术语来表示“任何具有特定名称(或签名)的成员的对象,都可以用于此语言功能”,如果这就是您所要求的。

语言功能在下面是如何工作的?

我不明白这个问题。如果语言特性意味着它调用具有特定名称的方法,它就会调用具有该名称的方法。就是这样。

在 C++、C# 和 Java 中,描述符的类和迭代器的类被定义为某些特定类的子类是否正确?

我不知道任何这些语言中有任何类似于描述符的东西,我认为推测如果它确实存在会是什么样子是没有意义的。

至于迭代器,这些语言中的每一个都有一个 foreach 循环,所以你可以看看:

在 C++ 中,基于范围的 for 循环适用于具有实例成员 beginend 或存在 beginend 函数的任何类型。返回的类型必须支持++!=* 运算符。

在 C# 中,foreach 循环适用于具有实例方法 GetEnumerator() 的任何类型,它返回具有 MoveNext() 方法和 Current 属性的类型。还有IEnumerable<T>接口,描述的是同一个形状。可枚举类型通常实现此接口,但并非必须这样做。

在 Java 中,增强的 for 循环适用于实现 Iterable 的任何类型。

因此,任何地方都没有子类(C# 和 Java 区分实现接口和从基类派生)。 Java 要求您实现一个接口。 C# 使用鸭子类型,但也可以选择允许您实现接口。 C++ 使用鸭子类型,根本没有接口或基类。

请注意,根据语言,决定是否为某种语言功能使用鸭式打字可能会很复杂。作为一个极端的例子,C#(集合初始化器)的一个特性需要实现一个特定的接口(@98​​7654336@),并且还需要一个具有特定名称的方法(Add)。所以这个特性是部分鸭式的。

【讨论】:

    【解决方案2】:

    这是duck typing的一个方面。

    作为一种动态类型语言,Python 不太关心对象的实际类型,而是关心它们的行为。俗话说,叫得像鸭子,那多半是鸭子;对于您的描述符,Python 只想知道它定义了特殊方法,如果它定义了,那么它接受它是一个描述符。

    【讨论】:

      【解决方案3】:

      您要查找的术语是 The Python Data Model(这不仅仅是 dunder-methods 和 -attributes,但它们是其中不可或缺的一部分)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 2014-11-08
        • 2018-04-28
        • 2014-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多