例如:
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
?
答案 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
...
请注意,您可以同时使用test
和self.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')