Pythonのアヒルの種類とポリモーフィズム
1.ダックタイプ
アヒルのように歩き、アヒルのように泳ぎ、アヒルのように鳴く鳥を見ると、この鳥はアヒルと呼ぶことができます。
class Cat(object):
def say(self):
print("i am a cat")
class Dog(object):
def say(self):
print("i am a dog")
class Duck(object):
def say(self):
print("i am a duck")
animal = Cat()
animal.say() # i am a cat
上記の3つのクラスにはすべてsay
メソッドが含まれています。
最初のインスタンスanimal
オブジェクトが、それは実行時に割り当てを与えることができるCat
、Dog
またはDuck
そう不明です。
java
実装、マルチステート、これは一般的に、親クラス定義、行われるAnimal
含む、say
方法、継承の次に、定義Animal
クラスのCat
サブクラスとCat
オーバーライドサブクラスsay
指示するように、方法をサブクラス。Cat
Animal
java
アイデアに基づいて、python
言語を使用してポリモーフィズムの概念を実現します
class Animal:
def say(self):
print("i am a animal")
class Cat(Animal):
def say(self):
print("i am a cat")
Animal an = Cat()
#在java中声明变量时需要定义变量类型,python中不能这样写
an.say() #调用子类方法
Pythonでインスタンス化されたオブジェクトは、任意の型を指すことができる動的変数です。つまり、メソッドをクラスに記述する必要があります。コードは以下と同じです。
animal_list = [Cat,Dog,Duck]
for animal in animal_list:
animal().say()
# i am a cat
# i am a dog
# i am a duck
すべてのタイプのメソッドが共通のメソッド名を実装すると、同じメソッドを循環的に呼び出してポリモーフィズムを実現できます。java
親クラスを継承してクラスを書き換える必要があるメソッドと比較すると、はるかに簡単です。
つまり、すべてのクラスまたはオブジェクトが共通のメソッドを実装し、メソッド名が同じである場合、これらのクラスは1つのタイプとして分類できます。
次に、別の例を見てみましょう
a = ["bobby1", "bobby2"]
b = ["bobby2", "bobby"]
name_tuple = ["bobby3", "bobby4"]
name_set = set()
name_set.add("bobby5")
name_set.add("bobby6")
a.extend(b)
print(a) # ["bobby1", "bobby2","bobby2", "bobby"]
質問を考えてみてください。extend
関数はリストのみを通過できますか?
extend
関数はソースコードでこのように定義されています
def extend(self, iterable: Iterable[_T]) -> None: ...
したがって、extend
関数はパラメータリストとしてのみ使用でき、任意のオブジェクトを反復でき、Python
真ん中tuple
にset
は反復可能なオブジェクトがあります。
したがってextend
、name_set
合計を関数に渡すname_tuple
ことができます。
a = ["bobby1", "bobby2"]
name_tuple = ["bobby3", "bobby4"]
name_set = set()
name_set.add("bobby5")
name_set.add("bobby6")
# a.extend(name_tuple)
# print(a) # ["bobby1", "bobby2","bobby3", "bobby4"]
a.extend(name_set)
print(a) # ["bobby1", "bobby2","bobby5", "bobby6"]
3つ目は、反復可能なクラスを拡張関数に渡すことです。
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
def __getitem__(self, item):
return self.employee[item]
def __len__(self):
return len(self.employee)
company = Company(["tom", "bob", "jane"])
a = ["bobby1", "bobby2"]
a.extend(company)
print(a) # ["bobby1", "bobby2","tom", "bob", "jane"]
extend
この関数は、たとえば__iter__
、オブジェクト内のイテレータを暗黙的に呼び出します(呼び出し後にイテレータ__getitem__
オブジェクトになります)。
サブセクション
Pythonのマジック関数はduckタイプを最大限に活用します。多くのマジック関数はオブジェクトで記述されており、Pythonインタープリター自体が認識できます。多くの組み込みPythonオブジェクトまたは組み込みクラスには、反復可能な機能などの非常に便利な機能があります。 、コンテキストマネージャー、コレクションシーケンス関連の機能など、コード自体はより柔軟です。