Pythonダイナミック言語とアヒルのタイプの詳細


今日はプログラミング言語の中のダイナミックタイプの言語とアヒルのタイプを話します。
動的言語
ウィキペディアの動的言語の定義:
動的プログラミング言語は、動作時にその構造を変えることができる言語です。例えば、新しい関数、オブジェクト、またはコードが導入され、既存の関数が削除されたり、他の構造上の変化があります。ダイナミック言語は現在非常に活力があります。例えばPHP、Ruby、Pythonはダイナミック言語です。C、C+、Javaなどはダイナミック言語ではありません。
この説明はとても抽象的で、実は動的言語は比較的静的言語で、静的言語の特徴はプログラム実行前にコードコンパイル時にコードからすべてを知ることができます。たとえば変数の種類、方法の戻り値のタイプです。

String s = "hello"
s = "world"
s = 1 //        
静的言語では、変数にはタイプ情報があります。これは一つのメモリエリアです。静的言語の利点はコード構造が非常に規範化していて、調整しやすいです。動的言語はプログラムが実行される時にのみすべてを知ることができます。変数(厳密には名前といいます。人の名前と同じです。)はタイプを指定する必要がありません。変数自体にはタイプ情報がありません。タイプ情報は対象にあります。オブジェクトはどのタイプですか?プログラムが実行される時に知っていなければなりません。ダイナミックタイプ言語の利点は読みやすいことです。多くのタイプの関連コードを書く必要はありません。欠点はデバッグしにくいことで、ネーミングが正しくないと読めなくなり、理解ができなくなります。

s = "hello"
s = "world"
s = 1 #          ,          
アヒルのタイプ
ダイナミックな言語でよくアヒルのタイプを言います。アヒルのタイプとは、歩くとアヒルのように鳴き、アヒルのようになるということです。それはアヒル(If it walks like a duck and quacks like a duck、it must be a duck)です。アヒルのタイプはプログラミング言語の中のダイナミックタイプ言語の中の一つの設計スタイルで、一つの対象の特徴は父の種類によって決まるのではなく、対象の方法によって決められます。
JavaやC++などの静的な言語を勉強していると、アヒルのタイプに対する理解はそれほど深くないかもしれません。なぜなら、静的な言語の対象の特性は父の種類によって異なります。動的言語は違っています。例えば、ローズマリー、なんでも実現しました。iter_同前next_u.この方法のオブジェクトはすべてローズマリーと呼ぶことができますが、オブジェクト自体はどのようなタイプですか?

# python3
class Foo:
def __iter__(self):
pass
def __next__(self):
pass
from collections import Iterable
from collections import Iterator
print(isinstance(Foo(), Iterable)) # True
print(isinstance(Foo(), Iterator)) # True
私たちはIteratorを継承する必要はありません。受信したい関数があるパラメータがIteratorタイプの場合、Fooのインスタンスオブジェクトが伝達されますが、問題はありません。Javaなどの静的言語に置き換えると、Iteratorまたはそのサブクラスを伝えなければなりません。アヒルのタイプは、一般的に「いいえ」のテスト方法と関数のパラメータの種類から得られるのではなく、ドキュメント、明瞭なコードとテストによって正確な使用を確保するのです。これは利点でもあり、欠点でもあります。

def greeting(name: str) -> str:
return 'Hello ' + name
この関数は、strタイプのパラメータを受信し、strタイプの値を返します。