Python動的言語とアヒルのタイプの詳細

2080 ワード

今日はプログラミング言語の動的タイプ言語とアヒルのタイプを話します.
ダイナミック言語
ウィキペディアの動的言語の定義:
動的プログラミング言語は、実行時にその構造を変更できる言語です.例えば、新しい関数、オブジェクト、さらにはコードを導入することができ、既存の関数を削除したり、他の構造上の変化をしたりすることができます.動的言語は現在、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 quaks like a duck,it must be a duck)です.アヒルのタイプはプログラミング言語の動的タイプ言語の設計スタイルであり、1つのオブジェクトの特徴は親によって決定されるのではなく、オブジェクトの方法によって決定される.
JavaやC++などの静的言語を学んでいる場合は、静的言語のオブジェクトの特性が親に依存するため、アヒルのタイプの理解はそれほど深くないかもしれません.ダイナミック言語は異なります.たとえば、反復器など、実装されています.iter__ および_next__メソッドのオブジェクトは反復器と呼ぶことができますが、オブジェクト自体がどのタイプなのかは制限されず、任意のクラスにカスタマイズできます.

# 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やそのサブクラスを渡さなければなりません.アヒルのタイプは通常、テスト方法と関数のパラメータのタイプのおかげで、ドキュメント、明確なコードとテストに依存して正しく使用されることを保証します.これは利点と欠点であり、欠点はドキュメントを通じてパラメータのタイプを知る必要があることです.この不足を補うために、Python 3.6はタイプ情報を導入し、変数を定義する際にタイプを指定することができます.例えば、

def greeting(name: str) -> str:
return 'Hello ' + name

この関数はstrタイプを受信するパラメータを表し、strタイプの値を返します.