logo

Python の抽象クラス

抽象クラスは、他のクラスの青写真とみなすことができます。 クラス 。これにより、抽象クラスから構築された子クラス内で作成する必要があるメソッドのセットを作成できます。

1 つ以上の抽象メソッドを含むクラスは、クラスと呼ばれます。 抽象クラス 。アン 抽象メソッド は、宣言はありますが、実装はありません。



大規模な機能ユニットを設計しているとき、またはコンポーネントのさまざまな実装に共通のインターフェイスを提供したいときに、抽象クラスを使用します。

Python の抽象基本クラス

抽象基本クラスを定義することで、共通のクラスを定義できます。 アプリケーションプログラムインターフェース(API) サブクラスのセットの場合。この機能は、プラグインなどを使用してサードパーティが実装を提供する場合に特に役立ちますが、すべてのクラスを念頭に置くことが難しい、またはそうでない大規模なチームや大規模なコードベースで作業する場合にも役立ちます。可能。

Python 抽象クラスの開発

デフォルトでは、 パイソン 提供しません 抽象クラス 。 Python には、A を定義するためのベースを提供するモジュールが付属しています。 要約 基本クラス(ABC) そのモジュール名は ABC



ABC 基本クラスのメソッドを抽象として装飾し、具体的なクラスを抽象基本の実装として登録することによって機能します。メソッドは、キーワード @abstractmethod で装飾されると抽象になります。

例 1:

このコードは、と呼ばれる抽象基本クラスを定義します。 ポリゴン Python の ABC (Abstract Base Class) モジュールを使用します。 Polygon クラスには、と呼ばれる抽象メソッドがあります。 ヌーフサイド これはサブクラスによって実装する必要があります。



Polygon には、三角形、五角形、六角形、四角形の 4 つのサブクラスが定義されています。これらの各サブクラスは noofsides メソッドをオーバーライドし、そのサブクラスが持つ面の数を出力することで独自の実装を提供します。

ドライバー コードでは、各サブクラスのインスタンスが作成され、各インスタンスで noofsides メソッドが呼び出されて、その形状に固有の辺の数が表示されます。

パイソン
# Python program showing # abstract base class work from abc import ABC, abstractmethod class Polygon(ABC): @abstractmethod def noofsides(self): pass class Triangle(Polygon): # overriding abstract method def noofsides(self): print('I have 3 sides') class Pentagon(Polygon): # overriding abstract method def noofsides(self): print('I have 5 sides') class Hexagon(Polygon): # overriding abstract method def noofsides(self): print('I have 6 sides') class Quadrilateral(Polygon): # overriding abstract method def noofsides(self): print('I have 4 sides') # Driver code R = Triangle() R.noofsides() K = Quadrilateral() K.noofsides() R = Pentagon() R.noofsides() K = Hexagon() K.noofsides()>

出力
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>

例 2:

ここで、このコードは、Python の ABC (Abstract Base Class) モジュールを使用して、Animal と呼ばれる抽象基本クラスを定義します。 Animal クラスには、実装のない move と呼ばれる非抽象メソッドがあります。 Animal には、Human、Snake、Dog、Lion の 4 つのサブクラスが定義されています。これらの各サブクラスは、move メソッドをオーバーライドし、特定の移動特性を出力することによって独自の実装を提供します。

パイソン
# Python program showing # abstract base class work from abc import ABC, abstractmethod class Animal(ABC): def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') # Driver code R = Human() R.move() K = Snake() K.move() R = Dog() R.move() K = Lion() K.move()>

出力
I can walk and run I can crawl I can bark I can roar>

サブクラスによる抽象の実装

ベースから直接サブクラス化することで、クラスを明示的に登録する必要を回避できます。この場合、Python クラス管理を使用して認識します。 プラグインの実装 実装として 抽象プラグインベース

パイソン
# Python program showing # implementation of abstract # class through subclassing import abc class parent: def geeks(self): pass class child(parent): def geeks(self): print('child class') # Driver code print( issubclass(child, parent)) print( isinstance(child(), parent))>

出力
True True>

直接サブクラス化を使用すると、基本クラスに派生した既知のクラスのリストを要求することで、プラグインのすべての実装を見つけることができるという副作用があります。

抽象基本クラスの具象メソッド

具象クラスには具象 (通常) メソッドのみが含まれますが、抽象クラスには具象メソッドと抽象メソッドの両方が含まれる場合があります。

具象クラスは抽象メソッドの実装を提供します。抽象基本クラスは、super() を介してメソッドを呼び出すことによって実装を提供することもできます。 super() を使用してメソッドを呼び出す例を見てみましょう。

パイソン
# Python program invoking a  # method using super() from abc import ABC class R(ABC): def rk(self): print('Abstract Base Class') class K(R): def rk(self): super().rk() print('subclass ') # Driver code r = K() r.rk()>

出力
Abstract Base Class subclass>

上記のプログラムでは、次を使用して抽象クラスのメソッドを呼び出すことができます。 素晴らしい()。

Python の抽象プロパティ

抽象クラスにはメソッドに加えて属性が含まれており、 @abstractproperty を使用して属性を定義することで、具象クラスで属性を必須にすることができます。

パイソン
# Python program showing # abstract properties import abc from abc import ABC, abstractmethod class parent(ABC): @abc.abstractproperty def geeks(self): return 'parent class' class child(parent): @property def geeks(self): return 'child class' try: r = parent() print(r.geeks) except Exception as err: print(err) r = child() print(r.geeks)>

出力
Can't instantiate abstract class parent with abstract methods geeks child class>

上記の例では、Base クラスはプロパティゲッター メソッドの抽象バージョンしか持たないため、インスタンス化できません。

抽象クラスのインスタンス化

抽象クラスは誰も持たないメソッドを持っているため、不完全です。 Python で抽象クラスのオブジェクトを作成できる場合、誰かが抽象メソッドを呼び出した場合にそのオブジェクトを使用しますが、呼び出す実際の実装はありません。

したがって、抽象クラスをテンプレートとして使用し、必要に応じてそれを拡張し、使用する前にその上に構築します。実際、抽象クラスは具象クラスではないため、インスタンス化できません。抽象クラスのオブジェクトを作成すると、 エラーが発生します

パイソン
# Python program showing # abstract class cannot # be an instantiation from abc import ABC,abstractmethod class Animal(ABC): @abstractmethod def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') c=Animal()>

出力:

Traceback (most recent call last): File '/home/ffe4267d930f204512b7f501bb1bc489.py', line 19, in c=Animal() TypeError: Can't instantiate abstract class Animal with abstract methods move>