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)
参考
所以我最近是 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)