Вызов переменной из функции classmethod в обычный метод

#python #class

#python #класс

Вопрос:

Я хотел бы вызвать переменную из classmethod в другой метод внутри того же класса:

 class A():
    @classmethod
    def b(cls):
        cls.g = 5
    def c(self):
        if self.g < 1:
            print("TestA")
        else:
            print("TestB")
  

При выполнении:

 x = A()
x.c()
  

Я получаю:

 AttributeError: 'A' object has no attribute 'g'
  

Я читал и искал похожий случай, но не нашел его. Большинство имеет дело с вызовом переменных из метода init, и это здесь не применимо.

Комментарии:

1. Не уверен, почему я получил -1 на этот вопрос…

2. Вероятно, это произошло, потому что ваш вопрос очень простой. И ошибка, которую вы получили, уже отвечает на вашу проблему. Если чего-то нет something else в качестве атрибута, это something else не было добавлено. Тогда возникает проблема выяснить, почему она не была добавлена. Это было забыто? Она была добавлена в неправильном месте? Зависит ли это от порядка операций, который был выполнен неправильно …?

3. Примечание: вы вызываете функции , а не переменные.

Ответ №1:

Если вы не запустите .b() его заранее, ваш .g не существует … вообще.

Добавьте __init__ функцию в свой класс и объявите .g там, чтобы убедиться, что она хотя бы существует.

Комментарии:

1. Или просто добавьте a g = None в свой класс…

2. g = None просто превратит AttributeError в a TypeError в Python 3, поскольку вы не можете сравнить None с 1 .

3. Действительно, но это поможет определить и найти проблему.

Ответ №2:

Вы не определили g как атрибут класса класса A . Это можно сделать следующим образом:

 class A():
    g = 7
  

но тогда в вашем коде вы g одновременно обрабатываете как instance ( self.g ), так и class variable ( cls.g ) . Хотя это работает ( self.g будет ссылаться cls.g ), это может сбивать с толку.