Python 类、实例变量和访问器方法
Python Classes, Instance Variables, and Accessor Methods
我正在研究 Python class 的问题集。我们被介绍给 类。我正在尝试 (A) 使用单个参数字符串创建一个名为 Sentence 的 class,并创建一个将句子存储为字符串的实例变量。 (B) 然后为 class 分配访问器方法:getSentence(return 作为字符串的句子), getWords(return 句子中的单词列表), getLength(return句子中的字符数)和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())
好的,这里有些事情你似乎误解了。
让我们从简单开始:
当您执行 line.getWords()
时,您尝试调用对象 line
的 getWords
方法。您似乎认为 line
是 Sentence
类型的对象,但事实并非如此。相反,line
只是一个字符串类型的对象,因为这是您在脚本的第一行中分配给它的内容。
相反,您需要创建对象类型 Sentence
的实例,如下所示:
sentence = Sentence(line)
然后您可以在该实例上调用您在 class 中定义的方法:
sentence.getWords()
正如其中一条评论所述,您的 class 界面也存在问题。尝试自己修复这些问题,或者在遇到问题时报告确切的问题。自己解决这类问题是您想要培养的技能组合的一部分。
将编程视为打地鼠游戏。你必须继续打击这些错误。您甚至可以在编写表达 class 应该如何表现的程序之前编写一系列测试。有多种框架可以执行此操作,包括 unittest
和 nose
,但最简单的是一系列 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
糟糕,参数名称不正确...继续这样做,直到一切正常。
class句:
def __init__(self, string):
self.output = string
self.getSentence = string
self.getWords = string.split()
self.getLength = len(list(string))
self.getNumWords = len(string.split())
def __str__(self):
return str(self.output)
def getSentence(self):
self.output = self.getsentence
def getWords(self):
self.output = self.getWords
def getLength(self):
self.output = self.getLength
def getNumWords(self):
self.output = self.getNumWords
您的代码中需要一个 def int。 getSentence、getWords、getLength、getNumWords 应该只更新(所以你可以在 int 中 return)。您不需要也不想要那些 def(s) 中的 return。
这是一种方法。根据您的代码 ;)
我正在研究 Python class 的问题集。我们被介绍给 类。我正在尝试 (A) 使用单个参数字符串创建一个名为 Sentence 的 class,并创建一个将句子存储为字符串的实例变量。 (B) 然后为 class 分配访问器方法:getSentence(return 作为字符串的句子), getWords(return 句子中的单词列表), getLength(return句子中的字符数)和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())
好的,这里有些事情你似乎误解了。
让我们从简单开始:
当您执行 line.getWords()
时,您尝试调用对象 line
的 getWords
方法。您似乎认为 line
是 Sentence
类型的对象,但事实并非如此。相反,line
只是一个字符串类型的对象,因为这是您在脚本的第一行中分配给它的内容。
相反,您需要创建对象类型 Sentence
的实例,如下所示:
sentence = Sentence(line)
然后您可以在该实例上调用您在 class 中定义的方法:
sentence.getWords()
正如其中一条评论所述,您的 class 界面也存在问题。尝试自己修复这些问题,或者在遇到问题时报告确切的问题。自己解决这类问题是您想要培养的技能组合的一部分。
将编程视为打地鼠游戏。你必须继续打击这些错误。您甚至可以在编写表达 class 应该如何表现的程序之前编写一系列测试。有多种框架可以执行此操作,包括 unittest
和 nose
,但最简单的是一系列 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
糟糕,参数名称不正确...继续这样做,直到一切正常。
class句:
def __init__(self, string):
self.output = string
self.getSentence = string
self.getWords = string.split()
self.getLength = len(list(string))
self.getNumWords = len(string.split())
def __str__(self):
return str(self.output)
def getSentence(self):
self.output = self.getsentence
def getWords(self):
self.output = self.getWords
def getLength(self):
self.output = self.getLength
def getNumWords(self):
self.output = self.getNumWords
您的代码中需要一个 def int。 getSentence、getWords、getLength、getNumWords 应该只更新(所以你可以在 int 中 return)。您不需要也不想要那些 def(s) 中的 return。
这是一种方法。根据您的代码 ;)