ホームページ  >  記事  >  バックエンド開発  >  Python のポリモーフィズムを理解する方法

Python のポリモーフィズムを理解する方法

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-06-18 09:19:385819ブラウズ

Python はポリモーフィズムをサポートしていませんし、ポリモーフィズムをサポートする必要もありません。Python はポリモーフィック言語であり、ダック タイピングを推奨しています。オブジェクトの有効なセマンティクスは、特定のクラスからの継承や特定のインターフェイスの実装によってではなく、現在のメソッドとプロパティのセットによって決まります。 Python のポリモーフィズムを理解する方法

ポリモーフィズム

は、親オブジェクトをその 1 つ以上の子オブジェクトと等しく設定できるようにする手法です。たとえば、Parent:=Child; などです。 More Morphism を使用すると、同じクラス (基本クラス) のポインターを使用して、異なるクラスのオブジェクトを参照したり、参照されるオブジェクトに応じて異なる方法で同じ操作を実行したりすることが可能になります。

関連する推奨事項: "Python ビデオ チュートリアル "

class A:
def prt(self):
print("A")
class B(A):
def prt(self):
print("B")
class C(A):
def prt(self):
print("C")
class D(A):
pass
class E:
def prt(self):
print("E")
class F:
pass
def test(arg):
arg.prt()
a = A()
b = B()
c = C()
d = D()
e = E()
f = F()
test(a)
test(b)
test(c)
test(d)
test(e)
test(f)

输出结果

A
B
C
A
E
Traceback (most recent call last):
File "D:/Python/多态1.py", line 45, in <module>
test(f)
File "D:/Python/多态1.py", line 30, in test
arg.prt()
AttributeError: &#39;F&#39; object has no attribute &#39;prt&#39;
Process finished with exit code 1

一見すると、Python は test(a)、test(b)、test( を呼び出す) ポリモーフィズムをサポートしているように見えます。 c )、test(d) は非常にうまく機能しますが、以下は大きく異なります。
test(e) を呼び出すとき、Python は e の prt メソッドを呼び出すだけで、e が A サブクラスのオブジェクトであるかどうかは判断しません (実際、テスト メソッドの定義時にパラメーターの型は指定されません) 、そしてPythonはそれをまったく判断できません)。
test(f) を呼び出すときにエラーが発生します。理由は非常に単純で、f には prt メソッドがありません。

まず第一に、Python はポリモーフィズムをサポートしていませんし、ポリモーフィズムをサポートする必要もありません。Python はポリモーフィック言語であり、ダック タイピングを推奨しています。以下は、Wikipedia からのダック タイピングの説明です:

プログラミングにおけるダック タイピング (英語: duck testing) は、動的型付けの 1 つのスタイルです。このスタイルでは、オブジェクトの有効なセマンティクスは、特定のクラスからの継承や特定のインターフェイスの実装によってではなく、現在のメソッドとプロパティのセットによって決まります。この概念の名前は、ジェームズ ウィットコム ライリーによって提案されたアヒル テストに由来しています。「アヒル テスト」は次のように表現できます:

「アヒルのように歩き、アヒルのように泳ぐ鳥を見ると、

アヒルタイピングでは、オブジェクト自体のタイプではなく、それがどのように使用されるかに焦点が当てられます。たとえば、
アヒル タイピングを使用しない言語では、アヒル型のオブジェクトを受け入れ、その walk メソッドと bark メソッドを呼び出す関数を作成できます。
ダックタイピングを使用する言語では、このような関数は任意の型のオブジェクトを受け入れ、その walk メソッドと call メソッドを呼び出すことができます。呼び出す必要があるメソッドが存在しない場合は、実行時エラーが発生します。正しい walk メソッドと call メソッドを持つオブジェクトはすべて関数で受け入れられるという事実が上記のステートメントにつながり、型を決定するこの方法の名前が付けられました。

ダックタイピングは、多くの場合、メソッドや関数のパラメーターの型をテストするのではなく、ドキュメント、明確なコード、および正しい使用法を保証するためのテストに依存することでメリットが得られます。静的型付け言語から動的型付け言語に移行するユーザーは、多くの場合、静的 (実行時前) 型チェックを追加しようとします。これにより、ダック タイピングの利点とスケーラビリティが損なわれ、言語の動的な性質が制約されます。

Python のオブジェクトもメモリの一部であることに疑いの余地はありません。メモリには属性とメソッドに加えて、オブジェクトの型も含まれます。a= などの参照を通じてオブジェクトにアクセスします。 A(). まず、Python でオブジェクト A を作成し、変数 a を宣言して、変数 a をオブジェクト A に関連付けます。変数 a には型がありません。その型は、関連付けられているオブジェクトによって異なります。 a=A() のとき、a は型 A の参照です。 a は型 A であると言えます。 a に値 3 が割り当てられ、a=3 の場合、a は整数参照ですが、Python は弱いわけではありません。言語を入力します。Python では '2' 3 はエラーを報告しますが、PHP では '2' 3 は 5 を返します。 Python の変数は c のポインタに似ていることがわかります。c との違いは、Python の変数は任意の型を指すことができることです。これを言うのは正確ではありませんが、理解しやすいです。
したがって、Python の実行中、パラメーターが渡されるまではパラメーターの型はわかりません。Python のメソッドも遅延バインディングですが、Java のポリモーフィック遅延バインディングとは異なります。少なくともオブジェクトの型は知っていますが、Python はパラメータの型を知りません。

テスト メソッドでは、1 つのパラメーターを受け取り、このパラメーターの prt メソッドを呼び出すことのみが規定されています。実行時に、このパラメータに prt メソッドがある場合、Python はそれを実行します。そうでない場合、abcde には prt メソッドがありますが、f にはないため、Python はエラーを報告します。したがって、上記の結果が得られます。これが Python の実行方法です。

以上がPython のポリモーフィズムを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。