プログラミング言語設計でPythonの言語機能と呼ばれる機能は何ですか?ダックタイピングですか?
「特定の名前(または署名)を持つメンバーを持つオブジェクトは、ここで動作できます」はダックタイピングです。私は、特定の名前(または署名)を持つメンバーを持つ任意のオブジェクトがより具体的な用語であるとは思わないが、これは言語機能のために働くことができます。
言語機能はどのように機能しますか?
質問が分かりません。言語機能は、特定の名前のメソッドを呼び出すことを意味する場合、その名前のメソッドを呼び出します。それでおしまい。
C++、C#、Javaでは、記述子のクラスとイテレータのクラスが特定のクラスのサブクラスとして定義されていたのは正しいですか?
私はこれらの言語のいずれかの記述子に似ていることに気づいていません。存在していた場合の見た目を推測するのは意味がないと思います。イテレータについては
は、これらの言語のそれぞれは、foreachループを持っているので、あなたがそれを見ることができます:
C++では、範囲ベースfor
ループは、インスタンスメンバーbegin
とend
またはのために持っている任意のタイプで動作しますbegin
およびend
関数が存在します。返される型は、++
,!=
、*
の演算子をサポートしなければなりません。 C#の
、foreach
ループはMoveNext()
方法とCurrent
性質と種類を返すインスタンスメソッドGetEnumerator()
を有する任意のタイプで動作します。同じ形状を表すIEnumerable<T>
インターフェイスもあります。列挙型は通常、このインタフェースを実装しますが、必須ではありません。
拡張されたfor
ループは、Iterable
を実装するすべてのタイプで動作します。
したがって、どこにもサブクラスはありません(C#とJavaは、インタフェースの実装と基本クラスからの派生を区別します)。 Javaでは、インターフェイスを実装する必要があります。 C#ではダックタイピングを使用しますが、オプションでインターフェイスを実装することもできます。 C++はダックタイピングを使用しています。インターフェースや基本クラスはまったくありません。
言語によっては、特定の言語機能にダックタイピングを使用するかどうかの決定が複雑な場合があることに注意してください。極端な例として、C#(コレクション初期化子)の1つの機能は、特定のインターフェイス(IEnumerable
)の実装と特定の名前(Add
)を持つメソッドの存在を必要とします。したがって、この機能は部分的にはダック型です。
_ "イテレータのクラスは、__next__という名前のメソッドを持つクラスとして定義されています" _これは間違っているか、少なくとも表現が不適切です。イテレータは '__next__'関数を持つ__object__です。イテレータのクラスは少しでも重要です。これはダックタイピングです。 –