LGB范围规则和在Python中使用“self”

时间:2010-11-03 08:29:28

标签: python

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的命名空间!所以,结果应该是“实例”。

这是错的吗?

3 个答案:

答案 0 :(得分:6)

这不是这个工作原理。方法内部的print(str2)访问全局str2。要访问str2成员,请使用print(self.str2)

阅读此SO question and answers以获取完整详情。摘录from there

  

在执行期间的任何时候,都有   至少有三个嵌套的范围   名称空间可以直接访问:   搜索到的最里面的范围   首先,包含本地名称;该   任何封闭函数的名称空间,   从...开始搜索   最近的封闭范围;中间   范围,搜索下一个,包含   当前模块的全球名称;和   最外面的范围(最后搜索)是   包含内置名称的命名空间。

这不包括班级成员,因此您必须使用self明确引用它们。

答案 1 :(得分:2)

在Python的范围解析期间,

selfself.__class__ 从不隐式搜索。

答案 2 :(得分:0)

因为你已经定义了str2 =“Global”,python解释器采用default.i同意Eli.if你想打印然后你必须显式打印(self.str2)来访问类变量str2 =“Class”

print g.str2(将为您提供Class作为输出)