Python 3.5.1:如何在课堂上进行while循环运行?

时间:2016-06-09 20:54:30

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

我正在研究课程是如何工作的,我想出了如何让课程在一些场景中运作。但是我找不到让我的场景工作的方法。它涉及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:我从Input中取出AddName parameters。我还将self.Input更改为self.Count,因此不会让人感到困惑。我还将self.Name += Input更改为self.Name.append(Input)。这些更新使代码更容易理解并修复了一些问题,但while loop不会运行。

1 个答案:

答案 0 :(得分:1)

立即出现的问题是:

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

第二个显示AddName除了self之外还需要一个参数。然而,前一行是一个不传递任何参数的调用。你需要让这两个匹配正确。

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

这是一个最低限度修正的版本:

self.Input

这&#34;工作&#34;从某种意义上讲,它并没有引发异常,但它可能并不能完全符合您的要求。最后一行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.Nameself.Name.append(Input)初始化为self.Name中的列表。

此代码也存在大量样式问题。我强烈建议重命名所有变量和属性。普通的Python风格是使用__init__来表示函数,方法,属性和大多数变量。只有班级有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) 调用AddName方法一次,那么将它作为一个单独的函数可能没什么意义。在这里,我将其合并到__init__。我还取消__init__,支持self.Input循环,并在获得有效名称时使用while True退出。可能无效的名称存储在名为break而非name的变量中,我已将Input文本移至"Your Dicer's name is"方法,而不是它是__str__属性的一部分。

但我不确定你为什么要在这里使用课程。通常一个类代表一个具体的东西&#34;存在于您的程序中。 name是一种非常抽象的东西&#34;。虽然拥有Name类并不总是不合理的,但更常见的是,Name只是一个附加到其他对象的属性(如name,或许,无论如何那是)。