2012-02-06 3 views
2

파이썬에서 내가 해결할 수없는 재미있는 상황이 발생했습니다. 나는 def a(self, x, y):과 같은 클래스 내에서 정의를 가지고 있으며 a(par1, par2)과 같은 다른 곳에서 호출되었습니다. 그러나 self 대신 par1이 대체되고 x 대신 par2이되고 y은 초기화되지 않은 상태로 유지됩니다. 그러나 그 경우가 아니어야합니다 : xy 대신에 par1par2이 있어야하고 파이썬은 self이 있어야합니다. 이것은 Python 2.7에서 올바르게 작동하지만이 재미있는 일은 3.2에서 발생합니다. 메서드 a에는 어떤 수식어도 없지만 호출하는 메서드는 @classmethod 수식 자입니다. 조금 이상합니다. @classmethod가 세 번째 버전에서 변경되었을 수도 있습니다. 아무도 무슨 일이 일어나고 있는지, 올바르게 작동하게 만드는 방법을 알고 있다면 알려주십시오.파이썬은 매개 변수 중 하나를 자체로 대체합니다.

감사합니다. 나는이 비슷한 코드를 추측하고있어 당신의 묘사에서

+1

당신은 ' .a (par1, par2)'와 같이'a'를 호출해야합니까? – ajwood

+3

코드의 전체 예제를 보여줄 수 있습니까? – SingleNegationElimination

+8

행동의 완전한 실행 가능한 예를 제공 할 수 있습니까? – Kevin

답변

0

은 : 2.7에서

class Test(object): 

    def a(self, par1, par2='empty'): 
     print(self, par1, par2) 

    @classmethod 
    def b(cls, fjord): 
     print(fjord) 
     cls.a('par1', 'par2') 

test = Test() 
test.a('this', 'that') 
test.b('cold') 

이과 같이 충돌 : 3.2에서 잘 작동

(<__main__.Test object at 0x00B4A710>, 'this', 'that') 

cold 

Traceback (most recent call last): 
    File "test.py", line 11, in <module> 
    test.b('cold') 
    File "test.py", line 7, in b 
    cls.a('par1', 'par2') 
TypeError: unbound method a() must be called with Test instance as first argument 
      (got str instance instead) 

동안 - 언 바운드 방법이 없기 때문에 더 이상 존재한다, 그들은 단순히 기능이다.

이유는 self이 인스턴스가 아니므로 클래스 메서드에서 호출 되었기 때문입니다. 클래스 메서드는 self이 아니므로 전달할 수 없습니다.

+0

그건 제가 생각하기에 시작한 것이지만 코드는 2.7에서 작동하지만 3.2에서는 실패합니다. –

+0

아마도 오류는 있지만 TypeError가 다른 곳에서 발견되고 있습니다. –

관련 문제