2012-02-06 2 views
2

Я столкнулся с забавной ситуацией на Python, которую я не могу решить. У меня есть функция определение внутри одного класса, как def a(self, x, y):, и он был вызван из другого места, как a(par1, par2). Однако происходит то, что par1 заменяется вместо self, par2 вместо x и y остается неинициализированным. Но этого не должно быть: par1 и par2 должны были быть размещены вместо x и y соответственно, и Python должен был получить self сам. Это правильно работает в Python 2.7, однако эта забавная вещь происходит в 3.2. Метод a не имеет модификаторов, однако метод, в котором я его вызываю, имеет модификатор @classmethod. Это немного странно, возможно, @classmethod был изменен в третьей версии. Если кто-то знает, что происходит или как правильно работать, скажите, пожалуйста.Python заменяет один из параметров на себя

Спасибо!

+1

Если вы вызываете 'a' как' .a (par1, par2) '? – ajwood

+3

вы можете показать полный пример того, как выглядит ваш код? – SingleNegationElimination

+8

Можете ли вы представить полный, управляемый пример поведения? – Kevin

ответ

0

Из вашего описания я угадывание код, подобных этому:

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') 

В 2.7 это падает так:

(<__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) 

В то время как в 3.2 он работает просто отлично - потому что несвязанные методы нет дольше существуют, они просто функции.

Причина: self не является экземпляром именно потому, что он вызывается из метода класса: метод класса не получает self, поэтому он не может передать его.

+0

Вот что я начал думать, но утверждение состоит в том, что код работает в 2.7, но не работает в 3.2. –

+0

Возможно, однако, он терпит неудачу, но TypeError оказывается в другом месте –

Смежные вопросы