5

背景:レジスターを備えたチップをモデル化するクラスがあります。チップには多数のレジスターがあり、そのうちの1つは内蔵温度センサーの高温制限です。

私は次のものを持っています:

class foo():
  def __init__(self):
    # does not set self._hiTemp!
    ...
  def setHiTemp(self, t):
    self._hiTemp = t
  def getHiTemp(self):
    return self._hiTemp
  def checkHiTemp(self):
    return self._temp > self._hiTemp

self._hiTempで宣言しない理由__init__は、ユーザーがチップの温度検知機能を気にしない可能性があるためです。ユーザーはさまざまな方法でチップを使用できますが、この変数に無意味な値を与えることには意味がありません。ただし、ユーザーself._hiTempが最初に設定せずに使用しようとすると、宣言されていない変数を使用するエラーは、数値の比較やNoneなどのあいまいなエラー(または場合によってはエラーがまったくない)よりもデバッグ/バックトレースがはるかに簡単です。

これは、pylintを開始するまではすべてうまくいきます。もちろん、W0201を取得します。属性はinitのほぼすべての場所で定義されています。このスタイルのコーディングが嫌われているのか、もしそうなら、「Pythonicの方法」とは何か疑問に思っています。

ありがとう

4

5 に答える 5

12

私がそれを行う方法は、それをNone「自然界では発生しない」または他の番兵値に設定することです。次に、設定が必要な操作assertの場合、呼び出し元がオブジェクトを不適切に使用しようとした場合に備えて、を使用してすばやく失敗します。

def __init__(self):
    self._hiTemp = None

def checkHiTemp(self):
    assert self._hiTemp is not None, 'Why you no set _hiTemp before checking it?'
    return self._temp > self._hiTemp
于 2011-08-10T02:00:56.670 に答える
6

PythonはJavaではないので、そのようなゲッターやセッターを書かないでください。あなたはこのようにあなたの問題を解決することができます

class Foo(object):
    def __init__(self, hiTemp=None):
        self._hiTemp = hiTemp

    @property
    def hiTemp(self):
        if self._hiTemp is None:
            raise AttributeError("You have not initialized hiTemp")
        return self._hiTemp

    @hiTemp.setter
    def hiTemp(self, value):
        self._hiTemp = value

    def checkHiTemp(self):
        return self._temp > self._hiTemp

foo=Foo()
foo.hiTemp = 50
print foo.hiTemp # Prints 50

foo=Foo(hiTemp=20)
print foo.hiTemp # Prints 20

foo=Foo()
print foo.hiTemp # Raises exception
于 2011-08-10T03:29:05.333 に答える
1

オブジェクトの特定の属性をメソッドを介して設定する場合は、初期化子でそれを使用できる理由が常にある可能性があります。あなたはただ使うことができますself._hiTemp=Noneあなたはすでにそれをリードすることによってプライベートとして宣言している_ので、ユーザーはそれに依存しないことを理解するでしょう。

于 2011-08-10T02:02:51.570 に答える
0

None値を使用して実際の値がないことを意味するのが通例です。で初期化できます__init__。この場合、負の数などの意味のない値を使用し、checkHiTempメソッドでそれを確認し、適切に初期化された値なしで使用された場合はカスタム例外を発生させることもできます。それはさらに意味のあるエラーです。

于 2011-08-10T02:00:10.990 に答える
0

ユーザーの観点からは、宣言されていない変数エラーよりも適切なエラーメッセージを表示する方がよいと思います。私はします:

def __init__(self):
    self._hiTemp = None

def setHiTemp(self, t):
    self._hiTemp = t

def getHitemp(self):
    if self._hiTemp is None:
        raise Exception('You need to setHiTemp() before using it.')
    else:
        return self._hiTemp

def checkHiTemp(self):
    if self._hiTemp is None:
        raise Exception('You need to setHiTemp() before using it.')
    else:
        return self._temp > self._hiTemp
于 2011-08-10T02:01:44.470 に答える