如何在类中使用类变量

时间:2017-05-12 02:35:16

标签: python python-2.7

例如:

class TEST:
    test = 'a'
    def __init__(self, test=TEST.test):
        self.test=test
    def resetTest(self):
        self.test=TEST.test

然后我收到了以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in TEST
NameError: name 'TEST' is not defined

如何在test类中使用类变量TEST

5 个答案:

答案 0 :(得分:1)

你应该像下面那样使用它

class TEST:
    test = 'a'
    def __init__(self):
        pass
    def resetTest(self):
        print self.test
        print TEST.test

t = TEST()
t.resetTest()

答案 1 :(得分:1)

让我们从一些背景开始,以便充分了解这里发生的事情。

请记住,程序只是一系列命令,告诉机器该做什么。编程语言为我们提供了一种组织和推理这些命令的方法,而无需了解特定于机器的实现,但结果需要在机器执行它们之前进行翻译。根据语言的不同,翻译可以通过编译器一次性完成,也可以根据需要通过解释器完成。

Compiled languages(例如C,Go或Haskell)使用编译器预先翻译整个代码,并输出包含所有翻译指令的新文件。这种方式,在许多情况下,编译器只要最终定义它们就可以解析乱序引用。像Python,Bash或Ruby这样的Interpreted languages(或脚本语言)使用解释器(例如python可执行文件)来逐个读取代码并立即执行每个翻译片段,而不是向前看。

在您的示例中,class声明被视为一个“片段”,并且在解析整个类主体之前,不会将其注册为解释器可访问的变量。

请注意,您的追溯指向__init__的{​​{1}}方法:

TEST

由于你现在正在定义类,因此解释器还不知道它,因此:

def __init__(self, test=TEST.test):
    self.test=test

TL; DR这只会发生,因为解释器正在尝试立即解析NameError: name 'TEST' is not defined ,因此它可以将TEST.test参数的默认值应该缓存到test函数声明。因此,在函数体内部移动引用是完全安全的,因为在您创建类的实例之前不会调用它:

__init__()

您也可以将默认变量放在超类中:

class TEST:
    test = 'a'

    def __init__(self, test=None):
        if test is not None and test != TEST.test:
            self.test = test

    def resetTest(self):
        self.test=TEST.test 

无论哪种方式它都会很丑陋和/或你必须妥协,所以我可能会在类之外声明默认值。

答案 2 :(得分:0)

至少有两种方法可以做到这一点:

只需删除TEST.

即可

而不是:

TEST.test

把:

test

作为__init__()中的参数。

def __init__(self, test=test):
    self.test = test
...

请注意,您可以同时使用testself.test两者,您可能不想要两者,所以不要self.test = test。还是......

虽然您发布的代码可能只是一个示例,但在这种情况下我只会这样做:def __init__(self, test='a'): ...这就是您在几乎所有情况下所做的事情。

答案 3 :(得分:0)

的含义是什么
  

self.test = TEST.test

我认为它无法重置成员变量... 你可以将两个“TEST.test”改为“a”

答案 4 :(得分:0)

类变量可以在方法定义的本地范围内访问(不需要TEST.),但不能访问方法体。所以,这将是编写示例的正确方法:

class TEST:
    # even for an example, this should be named something like default_test.
    test = 'a'

    def __init__(self, test=test):   # can see TEST.test without the classname
        self.test=test

    def resetTest(self):
        self.test=TEST.test          # needs the class name to see TEST.test

一些测试:

In [23]: TEST.test
Out[23]: 'a'

In [24]: t = TEST()

In [25]: t.test, TEST.test
Out[25]: ('a', 'a')

In [26]: t2 = TEST(123)

In [27]: t2.test, TEST.test, t.test
Out[27]: (123, 'a', 'a')

In [28]: t2.resetTest()

In [29]: t2.test, TEST.test, t.test
Out[29]: ('a', 'a', 'a')