这是一个编程语言概念问题,例如类似于编程语言语用学的水平,由Scott。
在Python中,某些类型的对象的类是通过一些具有特殊名称的方法来定义的,例如,
__get__
,__set__
或__delete__()
的方法的类。__next__
。问题:
在C ++,C#和Java中,描述符的类和一个是正确的
迭代器的类将被定义为某些类的子类
特别的课程? (类似于C#interface IDisposable
)
在Python中,
可以描述符'类被定义为某个特定类的子类?
迭代器可以'类被定义为某个特定类的子类?
答案 0 :(得分:1)
您正在寻找的术语是The Python Data Model(除了dunder-methods和-attributes之外,还有其他更多内容,但它们是其中不可或缺的一部分。)
答案 1 :(得分:1)
这是鸭子打字的一个方面。
Python作为一种动态类型的语言,不关心对象的实际类型而不关心它们的行为。俗话说,如果它像鸭子一样嘎嘎叫,那么它可能就像一只鸭子;在你的描述符的情况下,Python只是想知道它定义了特殊方法,如果确实如此,那么它接受它是一个描述符。
答案 2 :(得分:1)
在编程语言设计中调用Python的语言特性是什么?它是鸭子打字吗?
"任何具有特定名称(或签名)成员的对象都可以在这里工作"是鸭子打字。我不认为有一个更具体的术语用于"任何具有特定名称(或签名)的成员的对象都可以用于此语言功能",如果这就是你所要求的。
语言功能如何在下面工作?
我不明白这个问题。如果语言功能意味着它调用具有特定名称的方法,则它会调用具有该名称的方法。那就是它。
在C ++,C#和Java中,描述符的类和迭代器的类是否已被定义为某些特定类的子类是否正确?
我不知道任何这些语言中与描述符有什么相似之处,我不认为如果确实存在它将如何看待是有意义的。
至于迭代器,这些语言中的每一种都有一个foreach循环,所以你可以看一下:
在C ++中,基于范围的for
循环适用于具有实例成员begin
和end
或begin
和end
的任何类型功能存在。返回的类型必须支持++
,!=
和*
运算符。
在C#中,foreach
循环适用于具有实例方法GetEnumerator()
的任何类型,该方法返回具有MoveNext()
方法和Current
属性的类型。还有IEnumerable<T>
界面,它描述了相同的形状。可枚举类型通常实现此接口,但它们不需要这样做。
在Java中,增强型for
循环适用于实现Iterable
的任何类型。
因此,任何地方都没有子类(C#和Java区分实现接口和从基类派生)。 Java要求您实现接口。 C#使用duck typing,但也可以选择允许你实现一个接口。 C ++使用duck typing,根本没有接口或基类。
请注意,根据语言,是否对某个语言功能使用duck typing的决定可能会很复杂。作为一个极端的例子,C#(集合初始化器)的一个特性需要实现特定的接口(IEnumerable
)以及具有特定名称(Add
)的方法的存在。所以这个功能是部分鸭子类型。