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