[解決済み] Pythonの抽象クラスで抽象プロパティを作成する方法
2022-04-21 21:22:06
質問
次のコードでは、ベースとなる抽象クラスを作成しています。
Base
. を継承するすべてのクラスが
Base
を提供するために
name
というプロパティがあったので、このプロパティを
@abstractmethod
.
のサブクラスを作成しました。
Base
という名前の
Base_1
これは、ある種の機能を提供しつつも、抽象的な状態を維持することを意図しています。また
name
のプロパティは
Base_1
しかし、それにもかかわらず python はエラーなしでそのクラスのオブジェクトをインスタンス化します。どのように抽象プロパティを作成するのでしょうか?
from abc import ABCMeta, abstractmethod
class Base(object):
__metaclass__ = ABCMeta
def __init__(self, strDirConfig):
self.strDirConfig = strDirConfig
@abstractmethod
def _doStuff(self, signals):
pass
@property
@abstractmethod
def name(self):
# this property will be supplied by the inheriting classes
# individually
pass
class Base_1(Base):
__metaclass__ = ABCMeta
# this class does not provide the name property, should raise an error
def __init__(self, strDirConfig):
super(Base_1, self).__init__(strDirConfig)
def _doStuff(self, signals):
print 'Base_1 does stuff'
class C(Base_1):
@property
def name(self):
return 'class C'
if __name__ == '__main__':
b1 = Base_1('abc')
解決方法は?
から
Python 3.3
のバグを修正しました。
property()
デコレーターが抽象的なメソッドに適用された場合、抽象的であると正しく認識されるようになりました。
注:順序が重要です。
@property
上
@abstractmethod
Python 3.3以上。 ( パイソン文書 ):
from abc import ABC, abstractmethod
class C(ABC):
@property
@abstractmethod
def my_abstract_property(self):
...
Python 2: ( パイソン文書 )
from abc import ABC, abstractproperty
class C(ABC):
@abstractproperty
def my_abstract_property(self):
...
関連
最新
-
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によるjieba分割ライブラリ
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない