0

オブジェクトの属性を設定する際にエラーをキャッチするために従うべき経験則はありますか? たとえば、次のような Shape クラスがあるとします。

class Shape():
    def __init__(self, size):
        self.size = size

私は次のことができます:

>>> s = シェイプ(3)

>>> Sサイズ

3

>>> s.size = "こんにちは"

>>> Sサイズ

'こんにちは'

しかし、属性が数値でなければならない場合はどうなるでしょうか? この状況で TypeErrors をキャッチするにはどうすればよいですか? init定義内に try/except を入れますか? これは私の推測です:

class Shape():
def __init__(self, size):
    try:
        float(size)
        self.size = size
    except:
        raise TypeError, "Value must be numeric"

これにより、初期化時にエラーがキャッチされますが、属性の設定時にはエラーがキャッチされません。ユーザーが s.size = "hello" を試行したときに TypeError をキャッチするにはどうすればよいですか?

ありがとうございました!

以下の答えを実装しようとしましたが、うまくいきませんでした:

class Shape():
def __init(self, size):
    self.size = size

@property
def size(self):
    return self._size
    
@size.setter
def size(self, value):
    self._size = float(value)

次のエラー メッセージが表示されます。

トレースバック (最新の呼び出しが最後): ファイル "python_playground.py"、18 行目

print s.size   File "python_playground.py", line 9, in size

return self._size AttributeError: Shape instance has no attribute '_size'
4

1 に答える 1

3

インスタンス属性を検証するには、プロパティを使用します。

class Shape():

    @property
    def size(self):
        return self._size

    @size.setter
    def size(self, value):
        self._size = float(value)

__init__()これで、メソッドは値を明示的にチェックする必要がなくなります (プロパティは他の場所と同様にそれを行うため) __init__()。また、コードがその属性を設定しようとする他の場所でも値をチェックします

あなたの質問に対するコメントで指摘したように、try/exceptここで使用する必要はありません。別の例外を発生させるために、1 つの例外をキャッチするだけです。float("hello")すでに完全に合理的な を提供していますValueError: could not convert string to float: 'hello'

(もちろん、その_size属性は保護されていませんが、Python で真に属性を保護することはできません。)

于 2013-05-03T19:47:44.143 に答える