2016-06-09 36 views
-3

我正在研究班级是如何工作的,并且我想出了如何在某些情景中让班级工作。但是我找不到让我的方案有效的方法。它涉及class Function():,def __init__(self):def AnotherFunction(self, Foo):。这些不是我场景中的实际“功能”,但它们非常相似。这里是我的代码:Python 3.5.1:我如何让while循环在类中运行?

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) 

我的问题是,为什么不会发生在classwhile loop?我试着查找其他堆栈溢出问题,类文章和教程,以及与while循环有关的其他问题,但无济于事。你能告诉我为什么它不会运行,以及如何解决这个问题?我将不胜感激。谢谢! :)

更新1:我把InputAddName parameters。我还添加了Name作为instance。但是这些更新没有奏效。

更新2:我把Input中的AddName parameters中。我也将self.Input更改为self.Count,所以不会混淆。我也将self.Name += Input更改为self.Name.append(Input)。这些更新使代码更容易理解并修复了一些问题,但while loop不会运行。

+0

你可以不带必需的参数('self.AddName()')来调用你的函数,为参数'Input'提供一个参数或者改变函数定义为'def AddName(self):...'。 –

+1

如果通过调用构造函数'x = Name()'来创建'Name'的实例,它会引发TypeError,因为'AddName'需要一个你不给它的参数,所以我假设问题是你是从不创建实例。 –

+0

@Jim这两个建议都不起作用 – BradTheBrutalitist

回答

1

眼前的问题是,在这些线路上:

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

第二个表明AddName预计除了self一个参数。然而,前一行是一个不会传递任何参数的调用。你需要让这两个匹配得当。

我认为在这种情况下,您不需要的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__中的列表。

此代码还有大量的样式问题。我强烈建议重命名所有的变量和属性。正常的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) 

如果你要调用AddName方法从__init__只有一次,可能没有很重要的一点是它是一个独立的功能。在这里,我刚刚合并到__init__。我还取消了self.Input,赞成while True循环,并使用break在我们获取有效名称时退出它。可能无效的名称存储在名为name的变量中,而不是Input,我已将"Your Dicer's name is"文本移至__str__方法,而不是将其作为name属性的一部分。

但我不确定为什么你在这里首先使用一个类。通常,一个类表示一个存在于程序中的具体“事物”。 A Name是一种非常抽象的“事物”。虽然并不总是不合理的,但更常见的情况是,name只是一个附属于某个其他对象的属性(如Dicer,无论是什么)。

+0

While循环仍然没有在这些答案中执行。而我之所以使用'class''函数“(或者任何你称之为类)的原因是因为这只是我使用'class'的一个东西。我也将它用于“角色”和“关卡”。你认为我应该将全部添加到'class'函数中以使它更加美观吗? – BradTheBrutalitist

+1

你如何使用代码?你怎么知道'while'循环是否运行?它适用于我在顶级(例如不在课堂上)时,我执行'n = Name()'。我不知道你的其他问题的含义。请阅读Python教程,以便了解术语,并且可以更好地交流。 – Blckknght