【问题标题】:Class NameError: name 'var' is not defined [duplicate]类NameError:名称'var'未定义[重复]
【发布时间】:2017-09-14 16:23:16
【问题描述】:
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.

为什么?

【问题讨论】:

  • 您已将var 设为属于Gui 类的类属性,因此您必须以Gui.var 的身份访问它。
  • 顺便说一句,您在refreshStats 上缺少self 参数(除非您打算将args 用作类)
  • @cricket_007:不,这会导致错误。从技术上讲,OP 只是将其重命名...

标签: python python-3.x nameerror


【解决方案1】:

如果您希望您的变量在类函数的范围内可见,请将 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()

【讨论】:

  • 如果类变量是故意的呢?
  • 您还应该在 init 函数中初始化您的类变量。查看编辑
  • 那叫实例变量,不是类变量
  • 完全正确,我希望我的编辑澄清了一些事情
【解决方案2】:

在类中创建类方法或实例方法,然后您可以访问所有类实例属性或方法内的变量,如果方法是实例方法,或者如果类方法则可以在方法内访问类属性

class A():
     a = 0

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

     @classmethod
     def bb(cls):
         """class method"""
         print cls.a

【讨论】:

    【解决方案3】:

    var 没有定义在您的refreshStats() 函数的范围内,因为它是一个类变量。

    因此,如果你想访问它,你可以Gui.var

    【讨论】:

    • 这基本上只是改写错误信息而没有解释为什么 var 没有定义。
    • @chepner 希望现在更有用
    猜你喜欢
    • 2016-10-08
    • 2018-08-01
    • 2020-06-17
    • 2016-07-06
    • 2015-10-22
    • 2016-05-12
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多