[解決済み] クラスインスタンスの属性を検証するための正しい方法
2023-02-13 20:33:23
質問
このような簡単なPythonのクラスを持っています。
class Spam(object):
__init__(self, description, value):
self.description = description
self.value = value
以下の制約を確認したいと思います。
- 説明文を空にすることはできません。
- "値は0より大きくなければなりません"
べきです。
1. スパムオブジェクトを作成する前にデータの検証を行うか?
2.
__init__
メソッドを使用する。
3.
is_valid
メソッドを作成し、spam.isValid() で呼び出す ?
4.
is_valid
の静的メソッドを作成し、Spam.isValid(description, value)で呼び出す ?
5.セッター宣言のデータをチェックする ?
6.その他
うまく設計された/ピトニック/冗長でない(多くの属性を持つクラスで)/エレガントなアプローチを推奨していただけませんか?
どのように解決するのですか?
Pythonを使用することができます。 プロパティ を使って、各フィールドに個別にルールをきれいに適用し、クライアントコードがフィールドを変更しようとしたときでさえ、それらを強制することができます。
class Spam(object):
def __init__(self, description, value):
self.description = description
self.value = value
@property
def description(self):
return self._description
@description.setter
def description(self, d):
if not d: raise Exception("description cannot be empty")
self._description = d
@property
def value(self):
return self._value
@value.setter
def value(self, v):
if not (v > 0): raise Exception("value must be greater than zero")
self._value = v
ルールに違反しようとすると例外が発生します。
__init__
関数の中でも例外が投げられ、その場合、オブジェクトの構築は失敗します。
UPDATEです。
2010年から今までの間に、私は
operator.attrgetter
:
import operator
class Spam(object):
def __init__(self, description, value):
self.description = description
self.value = value
description = property(operator.attrgetter('_description'))
@description.setter
def description(self, d):
if not d: raise Exception("description cannot be empty")
self._description = d
value = property(operator.attrgetter('_value'))
@value.setter
def value(self, v):
if not (v > 0): raise Exception("value must be greater than zero")
self._value = v
関連
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] インスタンスのクラス名を取得する?
-
[解決済み] ファイルに行を書き込む正しい方法?
-
[解決済み] クラスをJSONシリアライザブルにする方法
-
[解決済み] Pythonでホームディレクトリを取得するための正しいクロスプラットフォームな方法は何ですか?
-
[解決済み] 複数の属性でリストを並べ替える?
-
[解決済み】既存のオブジェクトインスタンスにメソッドを追加する
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Python 3でバイナリデータを標準出力に書き込むには?
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
最新
-
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-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] Pythonの辞書にあるスレッドセーフについて