【问题标题】:Python Classes, Instance Variables, and Accessor MethodsPython 类、实例变量和访问器方法
【发布时间】:2017-03-20 02:20:06
【问题描述】:

我正在处理一个 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())

【问题讨论】:

  • 成功了吗?有什么问题?
  • 它不像我想象的那样工作。我在上面创建了一个示例字符串“This Tuesday...”,当我输入line.getSentence() 时,我收到“AttributeError:'str' object has no attribute 'getSentence'”
  • 这是您的第一个问题。您想将字符串传递给类以进行进一步处理。一个简单的测试是foo = Sentence(line)。这将失败,因为Sentence.__init__ 需要一堆变量。但是string, words, length, num 是由类计算的,因此您不应将它们传递给初始化程序。所以把它们拿出来。然后你会遇到下一个问题......这就是所谓的“测试驱动开发”。编写中断测试、修复问题、编写更多测试。

标签: python class methods instance-variables accessor


【解决方案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】:

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

    让我们从简单的开始:

    当你做line.getWords()时,你尝试调用对象linegetWords方法。您似乎认为lineSentence 类型的对象,但事实并非如此。相反,line 只是一个字符串类型的对象,因为这是您在脚本的第一行中分配给它的。

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

    sentence = Sentence(line)
    

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

    sentence.getWords()
    

    正如其中一个 cmets 所述,您的类的接口也存在问题。如果遇到困难,请尝试自己解决这些问题或报告确切的问题。自己解决这类问题是您想要培养的技能的一部分。

    【讨论】:

      【解决方案3】:

      类句:

      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 中返回)。您不需要也不希望这些 def(s) 中的返回。

      这是一种方法。根据你的代码;)

      【讨论】:

        猜你喜欢
        • 2021-06-03
        • 2017-06-18
        • 2012-08-23
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多