@Pro100usr

Почему при обращении к @classmethod возникает NameError: name 'cls' is not defined?

тестирую обращения, вот возникла проблемка, когда обращаюсь через "cls." возникает ошибка с названием темы. Хочется обращаться через такой префикс, вроде как так правильней чем через названия класса "Test." . Как-то можно исправить? Спасибо
class Test():
    
    @classmethod
    def infield(cls):
        #проверка 1 значение в поле
        print("test")
    
    def zas(self):
        cls.infield()
        
da = Test()
da.zas()

но так работает
class Test():
    
    @classmethod
    def infield(cls):
        #проверка 1 значение в поле
        print("test")
    
    def zas(self):
        Test.infield()
        
da = Test()
da.zas()
  • Вопрос задан
  • 307 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
cls и self - это никакие не префиксы, а обычные перемнные. Они поступают в виде первого аргумента метода.
Вы даже назвать их можете по-другому и ничего не поломается.
Попробуйте, всё-таки, почитать книжку по питону по порядку, а не действовать методом тыка и не гадать на кофейной гуще.
В функции zas у вас нет переменной cls, отсюда и NameError.
Получить класс объекта можно с помощью функции type: type(self).infield()

Ну и да, судя по всему, вы не поняли до конца для чего нужны классовые методы, а для чего обычные.
Ктсати, Test().zas() отработает вполне корректно, не смотря на то, что это классовый метод, а вызывается он у инстанса. Просто классовому методу будет передан в аргумент класс, а не инстанс.

Серёьзно. Бросайте пытаться разбираться в этом методом тыка и вопросов на QnA. Там дальше наследование, полиморфизм, множественное наследование, метаклассы... Вы всех задолбаете и будете этим заниматься целую вечность
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы