我需要一个抽象类来维护成绩,并且应该有一个get_grade()
返回 4.0 比例值的操作,并且必须是抽象的。这是我到目前为止所拥有的:
from abc import ABCMeta, abstractmethod
class Assessment:
__metaclass__ = ABCMeta
@abstractmethod
def get_grade(self)
return
我在这做错了什么以及如何返回 4.0 比例的值?
我需要一个抽象类来维护成绩,并且应该有一个get_grade()
返回 4.0 比例值的操作,并且必须是抽象的。这是我到目前为止所拥有的:
from abc import ABCMeta, abstractmethod
class Assessment:
__metaclass__ = ABCMeta
@abstractmethod
def get_grade(self)
return
我在这做错了什么以及如何返回 4.0 比例的值?
通常问“我做错了什么”而不解释是什么让你认为这是错误的,这通常不是很有帮助。
但是,您的代码存在两个问题。
首先,你会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