2016-11-06 6 views
1

私はPythonクラスの問題を設定しています。私たちはクラスに紹介されています。私は、(A)単一のパラメータstringを持つSentenceというクラスを作成し、その文を文字列として格納するインスタンス変数を作成しようとしています。 (B)次に、getSentence(文を文字列として返す)、getWords(文の中の単語のリストを返す)、getLength(文の中の文字の数を返す)、getNumWords文中の単語の数)。以下は私が試みたことです:Pythonクラス、インスタンス変数、およびアクセサメソッド

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

[OK]を、あなたは誤解があるようだここで起こっていくつかのことがあります。

は簡単に始めるのをしてみましょう:

あなたは、あなたがオブジェクトlinegetWordsメソッドを呼び出すためにline.getWords()しようとしないとき。 lineはタイプSentenceのオブジェクトだとは思われていますが、そうではありません。その代わりに、lineは文字列型のオブジェクトです。これは、スクリプトの最初の行で割り当てられた文字列であるためです。

代わりに、あなたはこのようなオブジェクト型Sentenceのインスタンスを作成する必要があります述べたように

sentence.getWords() 

sentence = Sentence(line) 

次に、あなたがそのインスタンスにクラスで定義されたメソッドを呼び出すことができますコメントの1つでは、クラスのインターフェースにも問題があります。あなた自身が問題を修正したり、問題が発生した場合は正確な問題を報告してください。この種の問題を自分で解決することは、開発したいスキルセットの一部です。

関連する問題