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

时间:2017-11-17 17:25:28

标签: python class

我没有使用全局变量,而是尝试在类中创建变量的实例,因为它似乎是最佳实践。如何在类中的其他函数中引用此变量?我原以为Test.running_sumrunning_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

4 个答案:

答案 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)