我没有使用全局变量,而是尝试在类中创建变量的实例,因为它似乎是最佳实践。如何在类中的其他函数中引用此变量?我原以为Test.running_sum
在running_sum
中会起作用或至少test_function
,但我也没有任何运气。非常感谢!
class Test:
def __init__(self):
self.root = None
running_sum = 0
def test_function(self):
print(Test.running_sum)
return
x = Test()
x.test_function()
错误:
Traceback (most recent call last):
File "so.py", line 1, in <module>
class Test:
File "so.py", line 10, in Test
x = Test()
NameError: name 'Test' is not defined
答案 0 :(得分:5)
使用方法签名中提供的self
参数。
请注意,您编写的内容不是方法,而是使用类Test
的外部函数。要编写Test
的方法,def
应位于class Test
内的缩进级别,如下所示:
class Test:
def __init__(self):
self.running_sum = 0
def test_function(self):
print(self.running_sum)
如果你想在这个&#34;最佳实践&#34;背后解释,有几件事需要补充。
假设您编写以下代码:
class Test:
numbers = []
def add(self, value):
self.numbers.append(value)
Test.numbers
列表实例化一次,并在Test
的所有实例中共享。因此,如果2个不同的实例添加到列表中,则两者都作用于同一列表:
a = Test()
b = Test()
a.add(5)
b.add(10)
assert a.numbers == b.numbers == Test.numbers
在__init__
函数中创建实例变量时,__init__
将在每个实例化时运行,因此,将不再共享该列表,因为它们将为每个单独的实例创建。
class Test:
def __init__(self):
self.numbers = []
def add(self, number):
self.numbers.append(number)
a = Test()
b = Test()
a.add(5)
b.add(10)
assert a != b
答案 1 :(得分:2)
作为对象属性:每个对象都有自己的对象。
Test
是班级; self
是调用该方法的Test
对象。
class Test:
def __init__(self):
self.root = None
self.running_sum = 0
def test_function(self):
self.running_sum += 1
print(self.running_sum)
return
x = Test()
y = Test()
x.test_function()
y.test_function()
输出: 1 1
作为类属性:所有对象共享同一个变量。
self.__class__
是调用对象的类(即Test
)。
class Test:
running_sum = 0
def __init__(self):
self.root = None
def test_function(self):
self.__class__.running_sum += 1
print(self.__class__.running_sum)
return
x = Test()
y = Test()
x.test_function()
y.test_function()
输出:
1
2
答案 2 :(得分:1)
如何在类
中的其他函数中引用此变量
我在这看错了几件事。首先,你在类本身上调用running_sum
这是没有意义的,因为你将running_sum
声明为Test
实例的属性。其次,从您格式化问题的方式来看,似乎test_function
不在类Test
之外,因为您将self
传递给它,所以它没有意义,这意味着它是一个实例方法。要解决此问题,请执行以下操作:
class Test:
def __init__(self):
self.running_sum = 0
def test_function(self):
print(self.running_sum)
然后再次这也很奇怪...当你只是简单地测试running_sum
的值时,为什么还需要一个“test_function”:
x = Test()
x.running_sum
答案 3 :(得分:1)
在__init__
函数中,您创建了一个local variable.
该函数在函数完成后将不再存在。
如果您要创建特定于对象 x
的变量,那么您应该创建一个self.running_sum
变量
class Test:
def __init__(self):
self.root = None
self.running_sum = 0
def test_function(self):
print(self.running_sum)
如果您想创建特定于类 Test
的变量,那么您应该创建一个Test.running_sum
变量。
class Test:
running_sum = 0
def __init__(self):
self.root = None
def test_function(self):
print(Test.running_sum)