某些 类 是根据具有特殊名称的方法来定义的语言特征是什么?
What is the language feature that some kinds of classes are defined in terms of having some methods with special names?
这是一道编程语言概念题,例如类似于 Scott 的编程语言语用学水平。
在Python中,某些对象的classes是根据具有特殊名称的一些方法来定义的,例如
- 描述符的 class 被定义为一个 class,它有一个名为
__get__
、__set__
或 __delete__()
.[=40= 的方法]
- 一个迭代器的 class 被定义为一个 class,它有一个名为
__next__
. 的方法
问题:
- 编程语言设计中Python中的语言特性是什么?是鸭子打字吗?
- 语言功能在底层是如何工作的?
在 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
循环适用于具有实例成员 begin
和 end
或 begin
和 [=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.
这是一道编程语言概念题,例如类似于 Scott 的编程语言语用学水平。
在Python中,某些对象的classes是根据具有特殊名称的一些方法来定义的,例如
- 描述符的 class 被定义为一个 class,它有一个名为
__get__
、__set__
或__delete__()
.[=40= 的方法] - 一个迭代器的 class 被定义为一个 class,它有一个名为
__next__
. 的方法
问题:
- 编程语言设计中Python中的语言特性是什么?是鸭子打字吗?
- 语言功能在底层是如何工作的?
在 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
循环适用于具有实例成员 begin
和 end
或 begin
和 [=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.