【问题标题】:Python 3.5.1: How Do I Make The while-loop Run in class? [closed]Python 3.5.1:如何让 while 循环在课堂上运行? [关闭]
【发布时间】:2016-10-10 16:44:51
【问题描述】:

我正在研究课程是如何运作的,并且我想出了如何让课程在一些场景中运作。但我找不到让我的场景发挥作用的方法。它涉及class Function():def __init__(self):def AnotherFunction(self, Foo):。在我的场景中,这些不是实际的“功能”,但是它们非常相似。这是我的代码:

class Name():
    def __init__(self, Name):
        self.Name = ["Your Dicer's name is: "]
        self.AddName()
    def AddName(self):
        self.Count = 1
        while(self.Input == 1):
            Input = input("What is your Dicer's name?:\n")
            if(any(BadWord in Input.lower() for BadWord in [])):
                print("That's an inappropriate name! Try again")
            elif(len(Input) < 3):
                print("That name is too short! Try again.")
            elif(len(Input) > 16):
                print("That name is too long! Try again.")
            else:
                self.Count -= 1
        self.Name.append(Input)

我的问题是,为什么while loop 不会出现在class 中?我尝试查找其他堆栈溢出问题、课程文章和教程,以及其他与 while 循环相关的问题,但无济于事。你能告诉我为什么它不会运行以及如何解决这个问题吗?我会很感激的。谢谢! :)

更新 1:我将 Input 放入了 AddName parameters。我还添加了Name 作为instance。但这些更新不起作用。

更新 2:我从 AddName parameters 中删除了 Input。我还将self.Input 更改为self.Count,所以它不会让人感到困惑。我还将self.Name += Input 更改为self.Name.append(Input)。这些更新使代码更易于理解并修复了一些问题,但while loop 无法运行。

【问题讨论】:

  • 您在没有所需参数的情况下调用您的函数 (self.AddName()),或者为参数 Input 提供一个参数,或者将函数定义更改为 def AddName(self): ...
  • 如果您通过调用构造函数x = Name() 创建Name 的实例,则会引发TypeError,因为AddName 接受了一个您没有提供的参数,所以我假设问题是你永远不会创建实例。
  • @Jim 这两个建议都不起作用
  • @TadhgMcDonald 我为AddName 输入了一个参数Input,但什么也没发生。
  • 让我将上述评论的重要部分加粗:“如果您 通过调用构造函数 x = Name() 创建 Name 的实例,它将引发 TypeError,因为 AddName 需要一个你没有给出它的论点,所以我假设问题是你从不创建实例。“除非你调用它们,否则你编写的函数不会执行,在这种情况下__init__当你实例化你的类时被调用。

标签: python class while-loop user-input python-3.5


【解决方案1】:

当前的问题在于以下几行:

    self.AddName()
def AddName(self, Input):

第二个表明AddName 除了self 还需要一个参数。然而,上一行是一个不传递任何参数的调用。您需要使这两者正确匹配。

我认为在这种情况下,AddName 不需要 Input 参数。您在函数中使用的 Input 变量来自用户输入(input 函数),并且该参数被完全忽略。 (注意,还有一个self.Input 属性,除了名称非常相似之外,它是无关的)。

这是一个最低限度的固定版本:

class Name():
    def __init__(self):
        self.Name = ["Your Dicer's name is: "]
        self.AddName()
    def AddName(self):              # no Input paramter needed on this line!!!!
        self.Input = 1
        while(self.Input == 1):
            Input = input("What is your Dicer's name?:\n")
            if(any(BadWord in Input.lower() for BadWord in [])):
                print("That's an inappropriate name! Try again")
            elif(len(Input) < 3):
                print("That name is too short! Try again.")
            elif(len(Input) > 16):
                print("That name is too long! Try again.")
            else:
                self.Input -= 1
        self.Name += Input           # you may want self.Name.append(Input) here

从某种意义上说,这“有效”,它不会引发异常,但它可能并不完全符合您的要求。最后一行self.Name += Input 将输入名称的每个字符附加到列表self.Name 上。这不是很有用。可能您希望 self.Name.append(Input) 或者 self.Name 不应该被初始化为 __init__ 中的列表。

此代码还存在大量样式问题。我强烈建议重命名变量和属性的 all。正常的 Python 风格是对函数、方法、属性和大多数变量使用lowercase_names_with_underscores。只有类有CapitalizedNames。您正在使用的 self.Input 属性也与局部变量 Input 令人困惑地相似,但它们实际上并不意味着任何非常接近的东西(self.Input 也不需要成为实例属性,而不是某种局部变量)。

这是对您的代码的重写,它并没有太大的不同,但风格要好得多:

class Name():
    def __init__(self):
        while True:
            name = input("What is your Dicer's name?:\n")
            if(any(bad_word in name.lower() for bad_word in [])):
                print("That's an inappropriate name! Try again")
            elif(len(name) < 3):
                print("That name is too short! Try again.")
            elif(len(name) > 16):
                print("That name is too long! Try again.")
            else:
                self.name = name
                break

    def __str__(self):
        return "Your Dicer's name is: {}".format(self.name)

如果您只从__init__ 调用AddName 方法一次,那么将它作为一个单独的函数可能没有多大意义。在这里,我刚刚将它合并到__init__。我还取消了self.Input,转而使用while True 循环,并在我们获得有效名称时使用break 退出它。可能无效的名称存储在名为name 而不是Input 的变量中,并且我已将"Your Dicer's name is" 文本移动到__str__ 方法,而不是让它成为name 属性的一部分。

但我不确定你为什么首先在这里使用一个类。通常,一个类代表程序中存在的具体“事物”。 Name 是一种非常抽象的“事物”。虽然拥有 Name 类并不总是不合理的,但更多情况下,name 只是附加到某个其他对象的属性(比如 Dicer,也许,不管那是什么)。

【讨论】:

  • While loop 仍然没有在这些答案中执行。我使用class“函数”(或任何你称之为类)的原因是因为这只是我使用class的事情之一。我也将它用于roleslevels。您认为我应该将所有内容添加到class 函数中以使其更加完善吗?
  • 你是如何尝试使用代码的?如何判断while 循环是否运行?当我在顶层(例如不在课堂上)做n = Name() 时,它对我有用。我不知道你的另一个问题是什么意思。请阅读 Python 教程,以便了解术语并更好地进行交流。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2015-07-25
  • 1970-01-01
相关资源
最近更新 更多