2016-06-09 3 views
-3

수업이 어떻게 작동하는지 연구 중이므로 수업을 만드는 방법을 알아 냈습니다 일부 시나리오. 그러나 시나리오를 만들 수있는 방법을 찾지 못했습니다. class Function():, def __init__(self):def AnotherFunction(self, Foo):이 포함됩니다. 그것들은 내 시나리오에서 실제 "함수"가 아니지만 매우 유사합니다. while loopclass에서 발생하는 거예요 이유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) 

내 질문은 : 여기 내 코드는? 다른 스택 오버 플로우 질문, 클래스 기사 및 자습서 및 while 루프와 관련된 다른 질문을 찾아 보았지만 아무 소용이 없었습니다. 너는 왜 달아나지 않고 어떻게 고칠 지 말해 줄 수 있니? 나는 그것을 고맙게 생각할 것이다. 감사! :)

업데이트 1 : AddName parametersInput을 넣었습니다. 또한 Nameinstance으로 추가했습니다. 그러나 이러한 업데이트는 작동하지 않았습니다.

업데이트 2 : AddName parameters 중에서 Input을 가져 왔습니다. self.Inputself.Count으로 변경하여 혼란을주지 않도록하십시오. self.Name += Inputself.Name.append(Input)으로 변경했습니다. 이러한 업데이트로 인해 코드를 이해하기가 다소 쉬워졌지만 일부 문제는 수정되었지만 while loop 실행이 어려웠습니다.

+0

필수 인수 ('self.AddName()')없이 함수를 호출하거나, 매개 변수'Input'에 인수를 제공하거나 함수 정의를'def AddName (self) : ...'로 변경하십시오. –

+1

생성자'x = Name()'을 호출하여'Name'의 인스턴스를 생성하면'AddName'이 제공하지 않는 인수를 가지므로 TypeError가 발생합니다. 그래서 문제가 있다고 가정합니다. 인스턴스를 생성하지 않습니다. –

+0

@Jim 그 두 가지 제안이 작동하지 않습니다. – BradTheBrutalitist

답변

1

즉각적인 문제는이 라인에 :

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

두 번째는 AddNameself뿐만 아니라 하나 개의 인수를 기대하고 있음을 보여준다. 그러나 이전 행은 인수를 전달하지 않는 호출입니다. 이 두 경기가 제대로 일치해야합니다.

이 경우에는 AddNameInput 매개 변수가 필요하지 않습니다. 함수에서 사용중인 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이 어떤 종류의 로컬 변수가 아니라 인스턴스 속성이 될 필요가 없습니다).).여기

은 크게 다르지하지 않는 코드의 재 작성,하지만 훨씬 더 스타일이있다 : 당신은 단 한 번 __init__에서 AddName 메소드를 호출 위하여려고하는 경우에

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__에 병합했습니다. 또한 self.Input을 폐회하고 while True 루프를 사용하고 유효한 이름을 얻을 때 break을 사용하여 종료합니다. 잠재적으로 유효하지 않은 이름이 Input이 아닌 name이라는 변수에 저장되고 name 속성의 일부가 아닌 "Your Dicer's name is" 텍스트를 __str__ 메소드로 이동했습니다.

하지만 처음에는 왜 여기 수업을 사용하는지 잘 모르겠습니다. 일반적으로 클래스는 프로그램에 존재하는 구체적인 "물건"을 나타냅니다. Name은 매우 추상적 인 "것"입니다. Name 클래스를 갖는 것이 항상 불합리한 것은 아니지만, 더 자주 name은 다른 객체 (예 : Dicer과 같은)에 첨부 된 속성 일뿐입니다.

+0

'While 루프 '는 아직 그 대답에서 실행되지 않습니다. 그리고'class "함수를 사용하는 이유는 클래스를 사용하고있는 것들 중 하나이기 때문입니다. 나는 또한'role'과'levels'에도 사용하고 있습니다. 더 많은 uuph를 주려면 클래스를 함수에 모두 추가해야한다고 생각합니까? – BradTheBrutalitist

+1

코드를 어떻게 사용하려고합니까? while 루프가 실행되는지 여부를 어떻게 알 수 있습니까? 최상위 레벨 (예 : 클래스가 아닌)에서'n = Name()'을 할 때 작동합니다. 나는 당신의 다른 질문이 무엇인지 전혀 모른다. 파이썬 튜토리얼을 읽고 용어를 이해하고 더 잘 의사 소통 할 수 있도록하십시오. – Blckknght

관련 문제