-1

グレードを維持する抽象クラスが必要でありget_grade()、4.0 スケールで値を返し、抽象でなければならない操作が必要です。ここに私がこれまでに持っているもの:

from abc import ABCMeta, abstractmethod

class Assessment:

    __metaclass__ = ABCMeta

    @abstractmethod
    def get_grade(self)
        return

これで何が間違っているのですか?4.0スケールで値を返すにはどうすればよいですか?

4

1 に答える 1

1

何が間違っていると思うのかを説明せずに「何が間違っているのか」と尋ねることは、一般的にあまり役に立ちません。

ただし、コードには 2 つの問題があります。

SyntaxErrorまず、次の行を取得します。

def get_grade(self)

defすべてのブロック導入ステートメントと同様に、ステートメントにはコロンが必要ですが、コロンはありません。

次に、それを修正すると、コードはコンパイルされますが、3.x を使用している場合は正しく動作しません。Python 2.x と 3.x のどちらを使用しているかは明確ではありませんが、3.x の場合、メタクラスを指定し__metaclass__ておらず、何もしないという名前のクラス変数を作成しているだけです。(また、2.x を使用している場合、クラスはクラシック クラスとして定義されますが、本体がメタクラスによって評価されると新しいスタイルのクラスになるため、混乱する可能性があります。)

したがって、コードの正しい 2.x バージョンは次のとおりです。

class Assessment(object):
    __metaclass__ = ABCMeta
    @abstractmethod
    def get_grade(self):
        return

正しい 3.x バージョンは次のとおりです。

class Assessment(metaclass=ABCMeta):
    @abstractmethod
    def get_grade(self):
        return

それを修正すると、コードが機能します。簡単にテストできる抽象メソッドを持つ抽象クラスを作成します。

>>> a = Assessment()
TypeError: Can't instantiate abstract class Assessment with abstract methods get_grade
>>> class Concrete(Assessment): pass
>>> b = Concrete()
TypeError: Can't instantiate abstract class B with abstract methods get_grade
>>> class Concrete2(Assessment):
...     def get_grade(self): pass
>>> c = Concrete2()
>>> class External(object):
...     def get_grade(self): pass
>>> Assessment.register(External)
>>> d = External()

もちろん、これはあなたの任務の始まりにすぎません。で何か役立つことを行うの具体的なサブクラスAssessment(または呼び出すクラス)を少なくとも 1 つ作成する必要があることは明らかです。Assessment.registerget_grade


「4.0 スケールで値を返す」サブクラスの例を次に示します。あなたが私たちに与えてくれたのはその一言だけなので、それがあなたの任務のためにあなたがするべきことのようなものかどうかはわかりませんが…</p>

class PopQuiz(Assessment):
    def __init__(self, score_out_of_100):
        self.score_out_of_100 = score_out_of_100
    def get_grade(self):
        score_out_of_4_0 = self.score_out_of_100 / 25.0
        return score_out_of_4_0
于 2013-04-11T00:06:55.293 に答える