Class NameError: имя 'var' не определено

class Gui():
    var = None
    def refreshStats(args):
        print(str(var))
clas = Gui()
clas.refreshStats()

След

File "sample.py", line 5, in refreshStats
    print(str(var))
NameError: name 'var' is not defined.

Почему?


person Danil Kondratiev    schedule 18.04.2017    source источник
comment
Вы сделали var атрибут класса, принадлежащий классу Gui, поэтому вам нужно обращаться к нему как Gui.var.   -  person khelwood    schedule 18.04.2017
comment
Между прочим, вам не хватает параметра self на refreshStats (если вы не собираетесь args быть классом)   -  person OneCricketeer    schedule 18.04.2017
comment
@ cricket_007: нет, это вызовет ошибку. технически OP просто переименовал его ...   -  person Karoly Horvath    schedule 18.04.2017


Ответы (3)


Если вы хотите, чтобы ваши переменные были видны в рамках функций вашего класса, передайте self в каждую функцию класса и используйте переменные вашего класса как self.var, например:

class Gui():
    var = None
    def refreshStats(self, args):
        print(str(self.var))
clas = Gui()
clas.refreshStats()

Если вы хотите использовать это как переменную экземпляра (только для этого экземпляра класса), а не как переменную класса (общая для всех экземпляров класса), вы должны объявить ее в функции __init__:

class Gui():
    def __init__(self):
        self.var = None
    def refreshStats(self, args):
        print(str(self.var))
clas = Gui()
clas.refreshStats()
person ClydeTheGhost    schedule 18.04.2017
comment
А что, если переменная класса была преднамеренной? - person OneCricketeer; 18.04.2017
comment
Вы также должны инициализировать переменные вашего класса в функции инициализации. см правки - person ClydeTheGhost; 18.04.2017
comment
Это называется переменной экземпляра, а не переменной класса - person OneCricketeer; 18.04.2017
comment
Совершенно верно, я надеюсь, что мои правки прояснили ситуацию - person ClydeTheGhost; 18.04.2017

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

class A():
     a = 0

     def aa(self):
         """instance method"""
         print self.a

     @classmethod
     def bb(cls):
         """class method"""
         print cls.a
person Kallz    schedule 18.04.2017

var не определен в области действия вашей refreshStats() функции, так как это переменная класса.

Таким образом, если вы хотите получить к нему доступ, вы можете сделать Gui.var.

person Community    schedule 18.04.2017
comment
По сути, это просто перефразирование сообщения об ошибке без объяснения почему var не определено. - person chepner; 18.04.2017
comment
@chepner, надеюсь, теперь более полезен - person ; 18.04.2017