2016-11-06 112 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 .__ init__'需要一堆变量。但是'string,words,length,num'是由类来计算的,所以你不应该把它们传递给初始值设定项。所以把它们拿出来。然后你会遇到下一个问题....这就是所谓的“测试驱动开发”。编写破解测试,修复问题,编写更多测试。 – tdelaney

回答

1

认为编程是一种捶打鼹鼠游戏。你必须不断冲击这些错误。甚至在编写程序之前,您可以编写一系列测试,以表明类应该如何运行。有这样做的各种框架,包括unittestnose,但最简单的事情是一系列的assert陈述。如果表达式不正确,他们所做的只是引发异常。

因此,让buitd一些测试

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' 

哎呀,这些参数是完全不必要的,所以我删除它们,然后再次运行,我也得到

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只是string类型的对象,因为这是您在脚本的第一行中分配给它的对象。

相反,你需要这样的对象类型Sentence的实例:

sentence = Sentence(line) 

然后,你可以调用你的类的实例定义的方法:

sentence.getWords() 

如前所述在其中一个评论中,你的班级的界面也存在问题。如果您遇到问题,请尝试自行解决问题或报告问题。自己解决这些问题是您想要开发的技能的一部分。