Python类,实例变量和访问器方法

时间:2016-11-06 19:05:59

标签: python class methods instance-variables accessor

我正在研究Python类的问题集。我们正在介绍类。我试图(A)用一个参数,字符串创建一个名为Sentence的类,并创建一个将句子存储为字符串的实例变量。 (B)然后为类分配访问器方法:getSentence(将句子作为字符串返回),getWords(返回句子中的单词列表),getLength(返回句子中的字符数)和getNumWords(返回句子中的单词数量)。以下是我到目前为止所尝试的内容:

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())

3 个答案:

答案 0 :(得分:1)

好的,这里发生了一些你似乎误解的事情。

让我们开始吧:

执行line.getWords()后,您尝试调用对象getWords的{​​{1}}方法。您似乎认为lineline类型的对象,但事实并非如此。相反,Sentence只是字符串类型的对象,因为这是您在脚本第一行中分配给它的内容。

相反,您需要像这样创建对象类型line的实例:

Sentence

然后,您可以调用在该实例上的类中定义的方法:

sentence = Sentence(line)

正如其中一条评论中所提到的,您的班级界面也存在问题。如果您遇到问题,请尝试自行修复或报告确切问题。自己解决这些问题是你想要发展的技能组合的一部分。

答案 1 :(得分: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'

糟糕,这些参数完全不需要,所以我删除它们然后再次运行

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

糟糕,参数名称不正确......继续这样做,直到一切正常。

答案 2 :(得分:0)

课堂句子:

DescribeAllEnumsAsStrings()

您的代码中需要定义 int 。 getSentence,getWords,getLength,getNumWords应该仅在更新(因此您可以在 int 中返回)。您不需要也不需要这些def中的返回值。

这是一种实现方式。根据您的代码;)