何が間違っていると思うのかを説明せずに「何が間違っているのか」と尋ねることは、一般的にあまり役に立ちません。
ただし、コードには 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.register
get_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