某些 类 是根据具有特殊名称的方法来定义的语言特征是什么?

What is the language feature that some kinds of classes are defined in terms of having some methods with special names?

这是一道编程语言概念题,例如类似于 Scott 的编程语言语用学水平。

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

  1. 描述符的 class 被定义为一个 class,它有一个名为 __get____set____delete__().[=40= 的方法]
  2. 一个迭代器的 class 被定义为一个 class,它有一个名为 __next__.
  3. 的方法

问题:

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

    在Python、

    • 能否将描述符的 class 定义为某些特定 class 的子class?

    • 是否可以将迭代器的 class 定义为某些特定 class 的子class?

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

这是鸭子打字的一个方面

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

What is the language feature in Python called in programming language design? Is it duck typing?

"Any object with a member with a specific name (or signature), can work here" 是鸭子打字。我不认为 "any object with a member with a specific name (or signature), can work for this language feature" 有更具体的术语,如果那是你要问的。

How does the language feature work underneath?

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

In C++, C#, and Java, is it correct that a descriptor's class and an iterator's class would have been defined as subclasses of some particular classes?

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

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

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

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

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

的类型

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

请注意,根据语言的不同,决定是否为特定语言功能使用鸭子类型可能很复杂。举一个极端的例子,C# 的一个特性(集合初始值设定项)需要实现特定接口 (IEnumerable) 以及存在具有特定名称的方法 (Add)。所以这个功能是部分 duck typed.