[解決済み】Pythonで抽象クラスを作ることは可能か?
2022-04-18 07:14:48
質問
Pythonでクラスやメソッドを抽象化するにはどうしたらいいですか?
を再定義してみました。
__new__()
というように
class F:
def __new__(cls):
raise Exception("Unable to create an instance of abstract class %s" %cls)
を作成しましたが、今度はクラス
G
を継承している
F
というように
class G(F):
pass
をインスタンス化することができません。
G
というのも、このクラスはスーパークラスの
__new__
メソッドを使用します。
抽象クラスを定義する良い方法はないでしょうか?
どのように解決するのですか?
を使用します。
abc
モジュールで抽象クラスを作成します。を使用します。
abstractmethod
メソッドの抽象化を宣言するデコレーターと、クラスの抽象化を宣言するデコレーターは、Pythonのバージョンに応じて3つの方法のうちの1つを使用します。
Python 3.4以降では、以下のような継承が可能です。
ABC
. 以前のバージョンの Python では、クラスのメタクラスは
ABCMeta
. メタクラスの指定は、Python 3とPython 2で構文が異なります。3つの可能性を以下に示します。
# Python 3.4+
from abc import ABC, abstractmethod
class Abstract(ABC):
@abstractmethod
def foo(self):
pass
# Python 3.0+
from abc import ABCMeta, abstractmethod
class Abstract(metaclass=ABCMeta):
@abstractmethod
def foo(self):
pass
# Python 2
from abc import ABCMeta, abstractmethod
class Abstract:
__metaclass__ = ABCMeta
@abstractmethod
def foo(self):
pass
どの方法を使っても、抽象的なメソッドを持つ抽象クラスをインスタンス化することはできませんが、それらのメソッドの具体的な定義を提供するサブクラスをインスタンス化することは可能です。
>>> Abstract()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Abstract with abstract methods foo
>>> class StillAbstract(Abstract):
... pass
...
>>> StillAbstract()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class StillAbstract with abstract methods foo
>>> class Concrete(Abstract):
... def foo(self):
... print('Hello, World')
...
>>> Concrete()
<__main__.Concrete object at 0x7fc935d28898>
関連
-
Python入門 openを使ったファイルの読み書きの方法
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み】Pythonの抽象的メソッド【重複あり