Python подставляет один из параметров в себя - PullRequest
2 голосов
/ 06 февраля 2012

Я столкнулся с забавной ситуацией в 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 был изменен в третьей версии.Если кто-то знает, что происходит или как заставить вещи работать правильно, пожалуйста, сообщите.

Спасибо!

1 Ответ

0 голосов
/ 07 февраля 2012

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

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, поэтому он не может передать его.

...