跨类函数的Python变量 - 如何调用它们?

use*_*489 1 python class

我试图在类中创建变量的实例,而不是使用全局变量,因为它似乎是最佳实践.如何在类中的其他函数中引用此变量?我原本以为这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()
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

Fun*_*ayu 5

使用self方法签名中提供的参数.

请注意,您编写的不是方法,而是使用类的外部函数Test.要编写一个方法Test,def应该在一个缩进级别内部class Test如下:

class Test:
    def __init__(self):
        self.running_sum = 0
    def test_function(self):
        print(self.running_sum)
Run Code Online (Sandbox Code Playgroud)

如果你想在这个"最佳实践"背后解释,有几件事要补充.

假设您编写以下代码:

class Test:
    numbers = []
    def add(self, value):
        self.numbers.append(value)
Run Code Online (Sandbox Code Playgroud)

Test.numbers列表实例化一次,并在所有实例中共享Test.因此,如果将2个不同的实例添加到列表中,则两者都作用于同一列表:

a = Test()
b = Test()
a.add(5)
b.add(10)
assert a.numbers == b.numbers == Test.numbers
Run Code Online (Sandbox Code Playgroud)

__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
Run Code Online (Sandbox Code Playgroud)