我正在研究课程是如何工作的,我想出了如何让课程在一些场景中运作。但是我找不到让我的场景工作的方法。它涉及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
不会运行。
答案 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.Name
或self.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
,或许,无论如何那是)。