str2 = "Global"
class InClass:
str2 = "Class"
def Set(self, msg):
self.str2 = msg
def Print(self):
print(str2)
g = InClass()
g.Set("Instance")
g.Print()
如果我运行此代码,我会得到“全局”。但我无法理解为什么。
通过调用实例g的Set()方法,变量str2现在位于实例g的名称空间中。然后,遵循LGB范围规则,实例g的命名空间是第一个可以找到str2的命名空间!所以,结果应该是“实例”。
这是错的吗?
答案 0 :(得分:6)
这不是这个工作原理。方法内部的print(str2)
访问全局str2
。要访问str2
成员,请使用print(self.str2)
。
阅读此SO question and answers以获取完整详情。摘录from there:
在执行期间的任何时候,都有 至少有三个嵌套的范围 名称空间可以直接访问: 搜索到的最里面的范围 首先,包含本地名称;该 任何封闭函数的名称空间, 从...开始搜索 最近的封闭范围;中间 范围,搜索下一个,包含 当前模块的全球名称;和 最外面的范围(最后搜索)是 包含内置名称的命名空间。
这不包括班级成员,因此您必须使用self
明确引用它们。
答案 1 :(得分:2)
self
和self.__class__
从不隐式搜索。
答案 2 :(得分:0)
因为你已经定义了str2 =“Global”,python解释器采用default.i同意Eli.if你想打印然后你必须显式打印(self.str2)来访问类变量str2 =“Class”
print g.str2(将为您提供Class作为输出)