2016-11-06 6 views
1

파이썬 클래스에 대한 문제 세트를 만들고 있습니다. 우리는 수업에 소개되고 있습니다. 나는 (A) 단일 매개 변수 인 string을 사용하여 Sentence라는 클래스를 만들고이 문장을 문자열로 저장하는 인스턴스 변수를 만들려고한다. (B) 그런 다음 getSentence (문장을 문자열로 반환), getWords (문장에서 단어 목록 반환), getLength (문장에서 문자 수 반환) 및 getNumWords (return 문장의 단어 수). 아래는 내가 시도한 것입니다 :파이썬 클래스, 인스턴스 변수 및 접근 자 메서드

line = "This Tuesday is Election Day" 

class Sentence: 
    def __init__(self, text, string, words, length, num): 
     self.text = sentence 
     self.string = str(self.text) 
     self.words = self.text.split() 
     self.length = len(self.text) 
     self.num = len(self.words) 

    def getSentence(self): 
     return self.string 

    def getWords(self): 
     return self.words 

    def getLength(self): 
     return self.length 

    def getNumWords(self): 
     return self.num 



line.getWords() 

감사합니다.

class Sentence: 
    def __init__(self, string): 
     self.astring = str(string) 

    def getSentence(self): 
     return self.astring 

    def getWords(self): 
     return (self.astring).split() 

    def getLength(self): 
     return len(self.astring) 

    def getNumWords(self): 
     return len(self.getWords()) 



string = Sentence("The Election is tomorrow") 

print (string.getSentence()) 
print (string.getWords()) 
print (string.getLength()) 
print (string.getNumWords()) 
+0

작동 했습니까? 문제가 무엇입니까? – tdelaney

+0

그것은 내가 상상하는 방식으로 작동하지 않습니다. 위의 예제 문자열을 작성하고 "This Tuesday ..."를 입력하고'line.getSentence()'받았습니다. 'AttributeError :'str '객체에'getSentence '속성이 없습니다. " – Babeeshka

+1

첫 번째 문제입니다. 추가 처리를 위해 문자열을 클래스에 전달하려고합니다. 간단한 테스트는'foo = Sentence (line)'입니다. 'Sentence .__ init__'은 많은 변수가 필요하기 때문에 실패합니다. 그러나'string, words, length, num '은 클래스에 의해 계산되므로 이니셜 라이저에 전달하면 안됩니다. 그러니 그들을 데리고 나와라. 그렇다면 다음 문제가 발생합니다 .... 이것은 "테스트 주도 개발"이라고합니다. 문제를 해결하고 더 많은 테스트를 작성하는 테스트를 작성하십시오. – tdelaney

답변

1

프로그래밍을 '첩자 형 게임'이라고 생각하십시오. 벌레들을 계속 두들겨 야합니다. 클래스가 어떻게 동작해야 하는지를 나타내는 프로그램을 작성하기 전에도 일련의 테스트를 작성할 수 있습니다. unittestnose을 포함하는 다양한 프레임 워크가 있지만 가장 간단한 것은 일련의 assert 문입니다. 표현식이 참이 아닌 경우 예외를 발생시킵니다.

그래서,

class Sentence: 
    def __init__(self, text, string, words, length, num): 
     self.text = sentence 
     self.string = str(self.text) 
     self.words = self.text.split() 
     self.length = len(self.text) 
     self.num = len(self.words) 

    def getSentence(self): 
     return self.string 

    def getWords(self): 
     return self.words 

    def getLength(self): 
     return self.length 

    def getNumWords(self): 
     return self.num 

line = "This Tuesday is Election Day" 
assert Sentence(line), "can initialize" 
assert Sentence(line).getSentence() == line, "can return sentence" 
assert Sentence(line).getWords() == ['This', 'Tuesday', 'is', 
    'Election', 'Day'], "can return words" 
# etc... 

내가 그것을 실행하고 나는

Traceback (most recent call last): 
    File "v.py", line 22, in <module> 
    assert Sentence(line), "can initialize" 
TypeError: __init__() missing 4 required positional arguments: 'string', 'words', 'length', and 'num' 

아차을 얻을, 이러한 매개 변수가 완전히 불필요한 몇 가지 테스트를 buitd 수 있습니다, 그래서 그들을 제거하고 다시 실행하고 나는

를 얻을 수
Traceback (most recent call last): 
    File "v.py", line 22, in <module> 
    assert Sentence(line), "can initialize" 
    File "v.py", line 3, in __init__ 
    self.text = sentence 
NameError: name 'sentence' is not defined 

매개 변수 이름이 잘못되었습니다 ... 모든 것이 작동 할 때까지 계속하십시오.

1

좋아, 몇 가지가 여기에 무슨 당신이 오해를 갖고있는 것 같다있다 :

다음은 작동 업데이트 된 코드입니다.

은의 쉽게 시작하자

당신이 line.getWords()을 수행 할 때, 당신은 객체 linegetWords 메소드를 호출하려고합니다. lineSentence 유형의 개체라고 생각하는 것 같습니다.하지만 그렇지 않습니다. 대신 line은 단순히 문자열 유형의 개체입니다. 스크립트의 첫 번째 줄에 할당 한 것이기 때문입니다. 언급 한 바와 같이

sentence.getWords() 

:

sentence = Sentence(line) 

그런 다음 해당 인스턴스 클래스에 정의 된 메소드를 호출 할 수 있습니다 :

대신,이 같은 개체 유형 Sentence의 인스턴스를 만들 필요가 주석 중 하나에서 클래스 인터페이스에 문제가 있습니다. 자신이 고치거나 정확한 문제가있는 경우 다시보고하십시오. 이러한 종류의 문제를 직접 해결하는 것은 개발하려는 스킬 셋의 일부입니다.