Python 和变量作用域

Ski*_*eak -1 python methods scope class class-variables

所以我最近刚接触 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()
Run Code Online (Sandbox Code Playgroud)

TestA将3 正确打印到屏幕的代码。然而,代码TestB却给了我NameError这样的说明:'varNum' is not defined。无论我是否有global varNum这条线,我都会收到该错误。

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

谢谢你的时间 :)

fra*_*ang 5

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

class TestB:
    varNum = 0
Run Code Online (Sandbox Code Playgroud)

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

class TestB:
    varNum = 0

    def __init__(self):
        self.varNum = 3

b = TestB()
print(b.varNum)  # print 3
print(TestB.varNum)  # print 0
Run Code Online (Sandbox Code Playgroud)

因此,类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
Run Code Online (Sandbox Code Playgroud)

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

class TestB:
    varNum = 0    

    @staticmethod
    def printClassNum():
        print(TestB.varNum)
Run Code Online (Sandbox Code Playgroud)

参考号