2017-09-17 8 views
0

これはプログラミング言語の概念に関する質問です。スコットのプログラミング言語のプラグマティックスのレベルに似ています。 Pythonで特殊な名前のメソッドを持つという点で、いくつかの種類のクラスが定義されているという言語機能は何ですか?

は、オブジェクトのいくつかの種類のクラスが特別な名前を持ついくつかの方法を有するという観点で定義され、例えば、

  1. 記述子クラスが指定されたメソッドを有するクラスとして定義され、__get____set__、または__delete__()
  2. イテレータのクラスは、__next__というメソッドを持つクラスとして定義されています。

質問:

  1. プログラミング言語の設計に呼ばれるPythonで言語機能とは何ですか?ダックタイピングですか?
  2. 言語機能はどのように機能しますか?
  3. C++、C#、Javaでは、記述子のクラスと イテレータのクラスが、特定のクラスのサブクラスとして定義されているのは正しいですか? Pythonで

    、(同様にC#のインターフェイスIDisposableに)

    • は記述子クラスは、いくつかの特定のクラスのサブクラスとして定義することができますか?

    • イテレータのクラスは、特定のクラスのサブクラスとして定義できますか?

+0

_ "イテレータのクラスは、__next__という名前のメソッドを持つクラスとして定義されています" _これは間違っているか、少なくとも表現が不適切です。イテレータは '__next__'関数を持つ__object__です。イテレータのクラスは少しでも重要です。これはダックタイピングです。 –

答えて

1

プログラミング言語設計でPythonの言語機能と呼ばれる機能は何ですか?ダックタイピングですか?

「特定の名前(または署名)を持つメンバーを持つオブジェクトは、ここで動作できます」はダックタイピングです。私は、特定の名前(または署名)を持つメンバーを持つ任意のオブジェクトがより具体的な用語であるとは思わないが、これは言語機能のために働くことができます。

言語機能はどのように機能しますか?

質問が分かりません。言語機能は、特定の名前のメソッドを呼び出すことを意味する場合、その名前のメソッドを呼び出します。それでおしまい。

C++、C#、Javaでは、記述子のクラスとイテレータのクラスが特定のクラスのサブクラスとして定義されていたのは正しいですか?

私はこれらの言語のいずれかの記述子に似ていることに気づいていません。存在していた場合の見た目を推測するのは意味がないと思います。イテレータについては

は、これらの言語のそれぞれは、foreachループを持っているので、あなたがそれを見ることができます:

C++では、範囲ベースforループは、インスタンスメンバーbeginendまたはのために持っている任意のタイプで動作しますbeginおよびend関数が存在します。返される型は、++,!=*の演算子をサポートしなければなりません。 C#の

foreachループはMoveNext()方法とCurrent性質と種類を返すインスタンスメソッドGetEnumerator()を有する任意のタイプで動作します。同じ形状を表すIEnumerable<T>インターフェイスもあります。列挙型は通常、このインタフェースを実装しますが、必須ではありません。

拡張されたforループは、Iterableを実装するすべてのタイプで動作します。

したがって、どこにもサブクラスはありません(C#とJavaは、インタフェースの実装と基本クラスからの派生を区別します)。 Javaでは、インターフェイスを実装する必要があります。 C#ではダックタイピングを使用しますが、オプションでインターフェイスを実装することもできます。 C++はダックタイピングを使用しています。インターフェースや基本クラスはまったくありません。

言語によっては、特定の言語機能にダックタイピングを使用するかどうかの決定が複雑な場合があることに注意してください。極端な例として、C#(コレクション初期化子)の1つの機能は、特定のインターフェイス(IEnumerable)の実装と特定の名前(Add)を持つメソッドの存在を必要とします。したがって、この機能は部分的にはダック型です。

1

あなたが探している用語は、(そこだけdunder-方法と-attributesよりこれに多くのだが、彼らはそれの不可欠な部分である)The Python Data Modelです。

1

これは、ダックタイピングの側面です。

Pythonは、動的に型定義された言語として、実際のオブジェクトの種類について、その動作についてよりも気にする必要がありません。諺のとおり、もしそれがアヒルのように突き刺すならば、おそらくアヒルです。あなたの記述子の場合、Pythonはそれが特別なメソッドを定義していることを知りたがっています。そうであれば、それは記述子であると受け入れます。

関連する問題