2016-06-09 33 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