0

@property デコレータを含む次のサンプル コードを使用します。

class Grade_Calculator(object):
    def __init__(self,score):
        self.score = score

    @property
    def grade(self):
        if self.score in range(60,70):
            grade = 'D'
        elif self.score in range(70,80):
            grade = 'C'
        elif self.score in range(80,90):
            grade = 'B'
        elif self.score in range(90,101):
            grade = 'A'
        return grade

    @property
    def failure(self):
        if self.score < 60:
            print 'See me'
            grade = 'F'
            return grade

およびインスタンス:

g = Grade_Calculator(28)

g.gradeを返しますUnboundLocalError。このエラーを回避するためfailure()に呼び出したいと思います。grade()

インスタンスの場合:

g = Grade_Calculator(89)

g.failure()静かに失敗します。この状況でフェイルセーフとして機能するように電話grade()をかけたいと思います。failure()

私はself.method()呼び出しを行うことについて多くの言及を見てきましたが、それらは私にとってはうまくいきません.デコレータの存在が私を何とか台無しにしていると思います:

@property
def grade(self):
    if self.score < 60:
        self.failure()
    elif self.score in range(60,70):
        grade = 'D'
    elif self.score in range(70,80):
        grade = 'C'
    elif self.score in range(80,90):
        grade = 'B'
    elif self.score in range(90,101):
        grade = 'A'
    return grade

g = Grade_Calculator(28)
g.grade
See me
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-667-fb10e6cf27d4> in <module>()
----> 1 g.grade

./sample.py in grade(self)
      6     def grade(self):
      7         if self.score < 60:
----> 8             self.failure()
      9         elif self.score in range(60,70):
     10             grade = 'D'

TypeError: 'str' object is not callable

私は何を理解していませんか?

4

2 に答える 2

2

プロパティとして定義failureしました。()したがって、記法を使用して呼び出すことはできません。実際、それをしないことは、プロパティを使用することの要点です。self.failure戻り'F'、それを呼び出そうとすると、文字列を呼び出せないというエラーが発生するのはそのためです。あたかもあなたが書いたかのように、'F'()これは明らかな間違いです。

また、取得した値を捨てておりfailure、失敗した場合にのみ値を返しています (つまり、Noneそうでない場合)。もちろんfailure、そもそも不合格の場合にのみアクセスします...その場合、内部failureでその状態を確認する必要はありませんよね?

また、プロパティに印刷するのはかなり悪いスタイルです。属性にアクセスしたときに何かが出力されるとは思わないでしょう。懸念事項の分離: クラス外の何かがおそらく印刷を行っているか、 によって返されたものを印刷するために呼び出す別のメソッドが必要ですgrade

私はあなたのクラスを次のように書き直します:

class Grade_Calculator(object):
    def __init__(self, score):
        self.score = score

    @property
    def grade(self):
        if self.failure:
            return 'F'
        if 60 <= self.score < 70:
            return 'D'
        if 70 <= self.score < 80:
            return 'C'
        if 80 <= self.score < 90:
            return 'B'
        if 90 <= self.score < 100:
            return 'A'

    @property
    def failure(self):
        return self.score < 60   # returns True or False

    def print_grade(self):
        print self.grade, "- see me" * self.failure

if __name__ == '__main__':
    c = Grade_Calculator(71)
    c.print_grade()
于 2013-08-13T19:50:02.367 に答える