2010-04-13 2 views
1

저는 방금 파이썬을 배우기 시작했습니다. 파이썬에서 OOP를 테스트하기위한 예제 스크립트를 작성했지만 매우 이상한 일이 발생했습니다. 클래스 메쏘드를 호출 할 때, 파이썬은 주어진 것보다 하나 많은 매개 변수로 함수를 호출합니다.잘못된 매개 변수 수를 가진 Python 호출 클래스 메서드


1. class Bar: 
2. num1,num2 = 0,0 
3. def __init__(num1,num2): 
4. num1,num2 = num1,num2 
5. def foo(): 
6. if num1 > num2: 
7.  print num1,'is greater than ',num2,'!' 
8. elif num1 is num2: 
9.  print num1,' is equal to ',num2,'!' 
10. else: 
11. print num1,' is less than ',num2,'!' 
12. a,b = 42,84 
13. t = Bar(a,b) 
14. t.foo 
15. 
16. t.num1 = t.num1^t.num2 
17. t.num2 = t.num2^t.num1 
18. t.num1 = t.num1^t.num2 
19. 
20. t.foo 

그리고 내가 오류 메시지 :


python test.py 
Traceback (most recent call last): 
    File "test.py", line 13, in 
t = Bar(a,b) 
TypeError: init() takes exactly 2 arguments (3 given) 

사람이 도와 드릴까요 여기

코드인가? 사전에
덕분에

답변

5

커플 것들이 :

  1. 귀하의 클래스는 Bar 이름하지만 당신은 bar(a, b)로 전화하는거야. 이 문제를 해결하려면 Bar(a, b)으로 변경하십시오.
  2. 클래스는 무언가로부터 상속해야합니다 (아무 것도없는 경우 object). 당신은 필요합니다 class Bar(object):
  3. 파이썬에서 인스턴스 메소드는 다른 전달 된 매개 변수보다 먼저 항상 객체 하나의 매개 변수로 제공됩니다. 따라서 def __init__(num1, num2):def __init__(self, num1, num2):이어야하고 def foo()과 동일해야합니다.
  4. 모든 인스턴스 변수는 접두사 self.이어야합니다. 따라서 num1self.num1 등이어야합니다.
  5. ^ 연산자는 부울 XOR입니다. 이것이 당신이 원하는 것이라면 확실하지 않습니다. 종종 전원 운영자 인 **과 혼동됩니다.

여기에 정리하고 그에 따라 고정, 당신의 예입니다 :

class Bar(object): 
    num1, num2 = 0, 0 
    def __init__(self, num1, num2): 
     self.num1, self.num2 = num1, num2 

    def foo(self): 
     if self.num1 > self.num2: 
      print self.num1,'is greater than ',self.num2,'!' 
     elif self.num1 is self.num2: 
      print self.num1,' is equal to ',self.num2,'!' 
     else: 
      print self.num1,' is less than ',self.num2,'!' 

a, b = 42, 84 
t = Bar(a, b) 
t.foo() 

t.num1 = t.num1^t.num2 
t.num2 = t.num2^t.num1 
t.num1 = t.num1^t.num2 

t.foo() 

그리고 결과 :

42 is less than 84 ! 
84 is greater than 42 ! 
+0

한 쌍은 두 ;-) 그러나 모든 4 점이 맞습니다! +1! – mjv

+0

글쓰기를 시작할 때 두 개가 있었는데, 두 개가 더 발견되었습니다! 다음 나는 편집하고 더 것을 찾아 냈다! :) – bcherry

+0

나는 그것을 고쳤지 만 클래스는 상속 할 필요가 없다. 아마도 우리는 여러 버전의 Python을 사용하고 있습니다. 여기에는 Windows 용 2.6.5가 사용됩니다. – Hussain

1

파이썬 식별자는 대소 문자를 구분 ... 바있다 = 바 ...

는 또한, 명시 적으로 같이 먼저 __init__() 방법의 인수, 무언가로 자신을 선언해야합니다!

그/그녀는 명시 적으로 self.와 인스턴스 변수 접두어하지 다른 일반적인 파이썬 초보자의 실수를 (커버로
def __init__(self, num1, num2): 
    #...etc. 

BTW, ... bcherry의 답변을 참조

+0

Woops ... 그 점은 죄송합니다. 내 실수였습니다 ... 고쳐졌습니다. – Hussain

7

인스턴스 메소드에 전달 된 첫 번째 인수는 인스턴스 자체입니다. 함수를 정의 할 때 일반적으로이 self라고 :

def __init__(self, num1, num2): 

the tutorial를 읽어보십시오.

특정 오류 메시지에 관해서
1

, 당신은 라인 (3)에 self 인수를 놓치고 읽어야합니다

다른 OOP 언어에서 인스턴스 메소드와는 달리
def __init__(self, num1,num2): 

, 파이썬, 당신은 명시 적으로 이름을 가지고 그러한 메소드를 정의 할 때의 최초의 인수로서의 인스턴스 그런 다음 obj.some_method()으로 전화하면 의 첫 번째 인수로 obj이 자동으로 암시 적으로 전달됩니다.

첫 번째 인수는 관용적으로 self으로 명명되어 있지만 다른 이름 지정을 중지시키는 것은 없습니다.

3

A) 관례, 방법의 첫 번째 매개 변수라고 자신을.

b) 온라인 4에서 당신은 스스로 할당하고 있습니다. 어쩌면 당신은 당신이 t의 방법 foo는 (라인 14, 20) 당신은 마지막에 괄호를 추가해야합니다을 호출 할 경우) self.num1, self.num2

C를하고 싶은 말 : t.foo()

d) 들여 쓰기는 관용적으로 4 칸씩 주어 지므로 훨씬 쉽게 읽을 수 있습니다.

편집 : Allen Downey의 저서 "Think Python : 컴퓨터 과학자처럼 생각하는 법"15-18 장을 참조하십시오. 이 책은 매우 짧고 멋지게 작성되었으며 읽기가 쉽습니다. 무료로 사용할 수 있습니다 here.

EDIT2 : 이전에는 알아 채지 못했지만 대시 톰 뱅이 아래의 설명에서 지적했듯이이 문맥에서 (8 행에서) == 대신에 ==를 사용하여 평등을 비교했을 때 가장 좋습니다 .

+0

감사합니다. 귀하의 제안이 효과가있었습니다. – Hussain

+0

일부/많은 것과는 달리 주목할만한 가치가 있습니까? 다른 언어에서는 'self'매개 변수가 파이썬에서 명시 적입니다. 따라서 클래스 멤버 메서드는 메서드에 전달하는 다른 매개 변수 외에도 '자체'매개 변수를 첫 번째 매개 변수로 사용해야합니다. 위의 b 지점에서 언급 한 것처럼 자기 역 참조 자체도 명시 적이어야합니다. –

관련 문제