Вызов метода экземпляра из метода класса, разрешенный в python3, запрещен в python 2? - PullRequest
2 голосов
/ 04 ноября 2019

Следующий фрагмент кода выдает ошибку в python2, но без ошибки с python3

class Steps(object):
    def step(self, msg="Default"):
        if not hasattr(self, "funky_attr"):
            print('No attr')
        print(self)
        print(msg)

class FirstTest(Steps):
    @classmethod
    def test_setup(cls):
      cls.step("This is the message")

if __name__ == '__main__':
    C = FirstTest()
    C.test_setup()

С python 2 выдает ошибку:

TypeError: несвязанный метод step () mustвызываться с экземпляром CifsTest в качестве первого аргумента (вместо этого получен экземпляр str)

В то время как с питоном 3 он работает нормально:

Нет атрибута

Этосообщение # Обратите внимание, здесь 'self' это str

По умолчанию

Это правильное поведение?

Python3 позволяет вызывать метод экземпляра из методов класса?

1 Ответ

2 голосов
/ 04 ноября 2019

В Python 3 методы являются обычными объектами функций (не экземплярами «несвязанного метода»), и поэтому они не проверяют, является ли первый аргумент экземпляром класса.

Не уверен, почему это изменение считалось важным(единообразие или производительность, вероятно), но то, что вы наблюдали, выглядит как нежелательный побочный эффект этого выбора.

...