2013-04-10 2 views
-1

그레이드를 유지하는 추상 클래스가 있어야하며 4.0 스케일에서 값을 반환하고 추상이어야하는 연산 get_grade()이 있어야합니다. 여기 내가 지금까지 가지고있는 것 :Abstract Python

from abc import ABCMeta, abstractmethod 

class Assessment: 

    __metaclass__ = ABCMeta 

    @abstractmethod 
    def get_grade(self) 
     return 

무엇이 잘못 되었습니까? 4.0 눈금으로 값을 반환하는 방법은 무엇입니까?

+2

첫째, 왜이'파이썬 2.7 태그 한 한 구절,하지만 ...이다, 아무 생각이 없다 '와'python-3.x'가 있습니다. 무엇 이니? 그리고 실제로 문제와 관련된 wxpython이나 PIL을 사용하고 있습니까? – abarnert

+2

어쨌든, 당신이 잘못하고있는 첫 번째 일은'def' 명령문에 콜론이 없다는 것입니다. 즉,'SyntaxError'를 얻을 수 있습니다. 두 번째로 잘못된 것은 metaclass를 잘못 지정하고 (3.x를 사용하는 경우) 또는 고전 클래스를 ABC로 사용하려고 시도하는 것입니다 (2.x 인 경우). – abarnert

+2

이러한 문제를 해결하면 잘못 처리하지 않을 것입니다. 그것은 모두 예상대로 작동합니다. 즉,'get_grade'를 구현하는 적어도 하나의 구체적인 서브 클래스를 정의하지 않는 한 아무런 도움이되지 않습니다. – abarnert

답변

1

내가 틀렸다고 생각하는 이유를 설명하지 않고 "내가 무엇을 잘못하고 있는지"묻는 것이 일반적으로 도움이되지 않습니다.

그러나 코드에 두 가지 문제가 있습니다. 모든 블록 도입 문장처럼, 콜론이 필요

def get_grade(self) 

def 문을, 그리고 당신이없는 :

첫째, 당신은이 라인에 SyntaxError을받을거야.

다음으로 코드를 수정하면 코드가 컴파일되지만 3.x를 사용하는 경우 코드가 제대로 작동하지 않습니다. Python 2.x 또는 3.x를 사용하는지 여부는 명확하지 않지만 3.x이면 메타 클래스를 지정하지 않고 그냥 아무것도하지 않는 __metaclass__이라는 클래스 변수를 작성하는 것입니다. 또한 2.x를 사용하는 경우 클래스는 클래식 클래스로 정의되지만 본문이 메타 클래스로 평가 될 때 새로운 스타일 클래스가되므로 혼란 스럽습니다.

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

그리고 올바른 3.X 버전은 다음과 같습니다 : 코드의 올바른 2.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() 

이 당신의 할당의 시작이다 : 그것은 당신이 쉽게 테스트 할 수 있습니다 추상적 인 방법으로 추상 클래스를 만듭니다. get_grade에서 유용하게 사용되는 Assessment (또는 Assessment.register이라고 부르는 클래스) 중 적어도 하나의 구체적인 하위 클래스를 만드는 것이 분명합니다.


다음은 "4.0 배율로 값을 반환하는"하위 클래스의 예입니다. 당신이 당신의 지정을 위해 어떻게해야하는지와 같은 아무것도 있다면 나는 모든 당신이 우리에게 준 때문에

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 
+0

내가 가지고있는 서브 클래스는 에세이라고 불린다. 그것은 하나의 등급 (4.0 규모의 숫자)으로 구성되어있다. get_grade 연산은 여기에 구현되어있다. 에세이 (평가) : def get_grade (self) 나는 ' 만약 내가 이것에 더 많은 것을 추가 해야할지, 아니면 이것을 @abarnet처럼 남겨 두어야하는지 알자. – user2267830

+0

그러면 그 번호를 돌려 주면된다 :'def get_grade (self) : return self.a'. – abarnert

+0

에세이 수업을 위해 나는 이것을 단지 @abarnet처럼 남겨 두었을 것입니다. – user2267830