Pythonのアヒルの種類とポリモーフィズム

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オブジェクトが、それは実行時に割り当てを与えることができるCatDogまたはDuckそう不明です。

java実装、マルチステート、これは一般的に、親クラス定義、行われるAnimal含む、say方法、継承の次に、定義AnimalクラスのCatサブクラスとCatオーバーライドサブクラスsay指示するように、方法をサブクラス。CatAnimal

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真ん中tuplesetは反復可能なオブジェクトがあります。

したがってextendname_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オブジェクトまたは組み込みクラスには、反復可能な機能などの非常に便利な機能があります。 、コンテキストマネージャー、コレクションシーケンス関連の機能など、コード自体はより柔軟です。

おすすめ

転載: blog.csdn.net/weixin_43901214/article/details/106922084