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

跨类函数的Python变量-如何调用它们?,python,class,Python,Class,我尝试在类中创建一个变量实例,而不是使用全局变量,因为这似乎是最佳实践。如何跨类中的其他函数引用此变量?我本以为Test.running_sum会有用,或者至少running_sum在Test\u function中有用,但我对这两种方法都没有任何运气。非常感谢 class Test: def __init__(self): self.root = None running_sum = 0 def test_function(self):

我尝试在类中创建一个变量实例,而不是使用全局变量,因为这似乎是最佳实践。如何跨类中的其他函数引用此变量?我本以为
Test.running_sum
会有用,或者至少
running_sum
Test\u 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
回溯(最近一次呼叫最后一次):
文件“so.py”,第1行,在
课堂测试:
测试中第10行的文件“so.py”
x=测试()
NameError:未定义名称“Test”

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

请注意,您编写的不是一个方法,而是一个使用class
Test
的外部函数。要编写
测试方法
def
应在
类测试
中的一个缩进级别,如下所示:

class Test:
    def __init__(self):
        self.running_sum = 0
    def test_function(self):
        print(self.running_sum)

如果你想对这一“最佳实践”进行解释,有几点需要补充

假设您编写以下代码:

class Test:
    numbers = []
    def add(self, value):
        self.numbers.append(value)
Test.numbers
列表实例化一次,并在
Test
的所有实例中共享。因此,如果列表中添加了两个不同的实例,则两个实例都作用于同一个列表:

a = Test()
b = Test()
a.add(5)
b.add(10)
assert a.numbers == b.numbers == Test.numbers
\uuuu init\uuuu
函数中创建实例变量时,
\uuuuu init\uuuu
将在每次实例化时运行,因此,列表将不再共享,因为它们将为每个单独的实例创建

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

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

请注意,您编写的不是一个方法,而是一个使用class
Test
的外部函数。要编写
测试方法
def
应在
类测试
中的一个缩进级别,如下所示:

class Test:
    def __init__(self):
        self.running_sum = 0
    def test_function(self):
        print(self.running_sum)

如果你想对这一“最佳实践”进行解释,有几点需要补充

假设您编写以下代码:

class Test:
    numbers = []
    def add(self, value):
        self.numbers.append(value)
Test.numbers
列表实例化一次,并在
Test
的所有实例中共享。因此,如果列表中添加了两个不同的实例,则两个实例都作用于同一个列表:

a = Test()
b = Test()
a.add(5)
b.add(10)
assert a.numbers == b.numbers == Test.numbers
\uuuu init\uuuu
函数中创建实例变量时,
\uuuuu init\uuuu
将在每次实例化时运行,因此,列表将不再共享,因为它们将为每个单独的实例创建

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
如何跨类中的其他函数引用此变量

有几件事我看错了。首先,您正在类本身上调用
running\u sum
,这没有意义,因为您将
running\u sum
声明为
Test
实例的属性。其次,从您设置问题格式的方式来看,
test\u function
似乎不属于类
test
,这没有意义,因为您将
self
传递给它,这意味着它是一个实例方法。要解决此问题,您可以执行以下操作:

class Test:
    def __init__(self):
        self.running_sum = 0
    def test_function(self):
        print(self.running_sum)
然后这也很奇怪。。。如果只需执行以下操作即可测试
运行_sum
的值,那么为什么需要“test_函数”

x = Test()
x.running_sum
如何跨类中的其他函数引用此变量

有几件事我看错了。首先,您正在类本身上调用
running\u sum
,这没有意义,因为您将
running\u sum
声明为
Test
实例的属性。其次,从您设置问题格式的方式来看,
test\u function
似乎不属于类
test
,这没有意义,因为您将
self
传递给它,这意味着它是一个实例方法。要解决此问题,您可以执行以下操作:

class Test:
    def __init__(self):
        self.running_sum = 0
    def test_function(self):
        print(self.running_sum)
然后这也很奇怪。。。如果只需执行以下操作即可测试
运行_sum
的值,那么为什么需要“test_函数”

x = Test()
x.running_sum

作为对象属性:每个对象都有自己的属性。
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. 一,

作为类属性:所有对象共享同一个变量。
self.\uuuu class\uuuuu
是调用对象的类(即
Test

输出:

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. 一,

作为类属性:所有对象共享同一个变量。
self.\uuuu class\uuuuu
是调用对象的类(即
Test

输出:

1
2

\uuuu init\uuuu
函数中,您已经创建了一个
局部变量。
该变量在函数完成后将不再存在

如果要创建特定于对象的变量
x
,则应创建一个
self.running\u sum
变量

class Test:
    def __init__(self):
        self.root = None
        self.running_sum = 0

    def test_function(self):
        print(self.running_sum)
如果要创建特定于类的变量
测试
,则应创建一个
测试。运行_sum
变量

class Test:
    running_sum = 0
    def __init__(self):
        self.root = None

    def test_function(self):
        print(Test.running_sum)

\uuuu init\uuuu
函数中,您已经创建了一个
局部变量。
该变量在函数完成后将不再存在

如果要创建特定于对象的变量
x
,则应创建一个
self.running\u sum
变量

class Test:
    def __init__(self):
        self.root = None
        self.running_sum = 0

    def test_function(self):
        print(self.running_sum)
如果要创建特定于类的变量
测试
,则应创建一个
测试。运行_sum
变量

class Test:
    running_sum = 0
    def __init__(self):
        self.root = None

    def test_function(self):
        print(Test.running_sum)

running_sum
是类
Test
实例的属性。你不能像在做
Test.running\u sum
那样对类本身调用它。我看到了另一个问题。为什么
test\u函数
test
类之外?没有意义那代码中的缩进是错误的<代码>x=Tes