[解決済み] 抽象的な属性(プロパティではない)?
2023-01-10 04:50:13
質問
抽象的なインスタンス属性を定義し、プロパティとしては定義しない場合のベストプラクティスは何でしょうか?
というようなことを書きたいと思います。
class AbstractFoo(metaclass=ABCMeta):
@property
@abstractmethod
def bar(self):
pass
class Foo(AbstractFoo):
def __init__(self):
self.bar = 3
の代わりに
class Foo(AbstractFoo):
def __init__(self):
self._bar = 3
@property
def bar(self):
return self._bar
@bar.setter
def setbar(self, bar):
self._bar = bar
@bar.deleter
def delbar(self):
del self._bar
プロパティは便利ですが、計算を必要としない単純な属性のためには、過剰なものです。これは、ユーザーがサブクラス化して実装するような抽象クラスでは特に重要です。
@property
と書けばいいものを
self.foo = foo
の中に
__init__
).
Pythonにおける抽象属性
質問は、使用する唯一の答えとして提案する
@property
と
@abstractmethod
: では私の質問に答えていません。
抽象クラス属性のActiveStateレシピを経由して
AbstractAttribute
が正しい方法かもしれませんが、私はよくわかりません。また、クラス属性でのみ動作し、インスタンス属性では動作しません。
どのように解決するのですか?
どうしてもサブクラスが所定の属性を定義していることを強制したい場合は、メタクラスを利用します。
class AbstractFooMeta(type):
def __call__(cls, *args, **kwargs):
"""Called when you call Foo(*args, **kwargs) """
obj = type.__call__(cls, *args, **kwargs)
obj.check_bar()
return obj
class AbstractFoo(object):
__metaclass__ = AbstractFooMeta
bar = None
def check_bar(self):
if self.bar is None:
raise NotImplementedError('Subclasses must define bar')
class GoodFoo(AbstractFoo):
def __init__(self):
self.bar = 3
class BadFoo(AbstractFoo):
def __init__(self):
pass
基本的にはメタクラスの再定義
__call__
を再定義して
check_bar
がインスタンスの init の後に呼ばれるようにします。
GoodFoo() # ok
BadFoo () # yield NotImplementedError
関連
-
[解決済み] Pythonでオブジェクトが属性を持つかどうかを知る方法
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] XMLを解析して、特定のノード属性のインスタンスをカウントするには?
-
[解決済み] 抽象的なクラスをインスタンス化することはできますか?
-
[解決済み】Pythonで抽象クラスを作ることは可能か?
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] Django filter queryset __in for *every* item in list
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
-
[解決済み] Pythonの抽象属性[重複]について