1. ホーム
  2. python

[解決済み] クラスインスタンスの属性を検証するための正しい方法

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