-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

通常问“我做错了什么”而不解释是什么让你认为这是错误的,这通常不是很有帮助。

但是,您的代码存在两个问题。

首先,你会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(或您调用的类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
于 2013-04-11T00:06:55.293 回答