Python 3.5.1:如何使while循环在类中运行



我在研究类是如何工作的,我发现了如何使类在一些场景中工作。但我找不到一种方法让我的场景发挥作用。它包括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()
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__中的列表。

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

相关内容

  • 没有找到相关文章