Python 和变量作用域

Python and Variable Scope

所以我最近是 Python 的新手,但我似乎能够编写一些东西并让它工作。然而,我一直在努力扩展我对语言工作原理的了解,将这个简单的文件放在一起让我感到困惑。

class TestA:
    def __init__(self):
        self.varNum = 3

    def printNum(self):
        print(self.varNum)


class TestB:
    varNum = 0

    def __init__(self):
        varNum = 3

    def printNum(self):
        global varNum
        print(varNum)

a = TestA()
a.printNum()

b = TestB()
b.printNum()

TestA 的代码正确地将 3 打印到屏幕。但是 TestB 的代码却给了我一个 NameError 声明:'varNum' is not defined。无论我是否有 global varNum 行,我都会收到该错误。

我想是什么让我感到困惑,是我将 __init__ 函数视为 class 构造函数。当我使用 Java 或 C# 等语言进行编程时,我在构造函数之外声明了全局变量,因此它们的范围是整个 class。这不是 Python 中的内容吗?我编写的代码只是将 self. 标记到所有内容上,因为我只是想快速将一些东西放在一起,但我现在正在尝试更多地了解该语言。 self. 是 Python 中生成 class 范围变量的唯一方法吗?或者还有其他方法吗?

感谢您的宝贵时间:)

在 Python 中,在 class 定义内而不是在方法内声明的变量是 class 或静态变量:

class TestB:
    varNum = 0

这将创建一个 class 级 varNum 变量,但这与任何实例级 varNum 变量不同,因此您可以:

class TestB:
    varNum = 0

    def __init__(self):
        self.varNum = 3

b = TestB()
print(b.varNum)  # print 3
print(TestB.varNum)  # print 0

因此,class TestB 应该以这种方式工作:

class TestB:
    varNum = 0

    def __init__(self):
        self.varNum = 3

    def printInstanceNum(self):
        print(self.varNum)    

    def printClassNum():
        print(TestB.varNum)

b = TestB()
b.printInstanceNum()  # print 3
TestB.printClassNum()  # print 0

请注意,由于方法 printClassNum() 中没有对实例对象的任何引用,我们不必将 self 作为参数。该方法实际上可以成为静态方法:

class TestB:
    varNum = 0    

    @staticmethod
    def printClassNum():
        print(TestB.varNum)

参考