我正在阅读一些wxPython代码来学习一些Python。请记住,我是一个真正的初学者,所以我的问题对你来说是显而易见的,但对我来说,这是神秘的,它可能会教会我很多东西来完全理解这个问题。
这里是代码:
class MainFrame(wx.Frame):
TITLE = "Frame"
POSITION = wx.DefaultPosition
SIZE = wx.DefaultSize
STYLE = wx.DEFAULT_FRAME_STYLE
LAYOUT_MANAGER = wx.GridBagSizer()
def __init__(
self,
parent = None,
id = wx.ID_ANY,
title = TITLE,
pos = POSITION,
size = SIZE,
style = STYLE,
name = wx.FrameNameStr
):
super(MainFrame, self).__init__(parent, id, title, pos, size, style,
name)
self.SetSizerAndFit(self.LAYOUT_MANAGER)
self.panel = MainPanel(parent=self)
我的问题很简单:如果我按照以下方式提及LAYOUT_MANAGER,为什么会得到NameError: global name 'LAYOUT_MANAGER' is not defined
:
self.SetSizerAndFit(LAYOUT_MANAGER)
删除self
引用,即。
为什么我感到困惑?只是因为在这种方法中,引用了POSITION
,SIZE
等字段而没有任何前缀self
,但如果我使用字段LAYOUT_MANAGER作为参数,则需要引用方法SetSizerAndFit
...
是什么给了什么?!
我可能忘记了这里最自然的语言范围/可见性规则..但是鉴于我知道的很少,能够写size = SIZE
没有self.
是没有意义的。 })但不能只写LAYOUT_MANAGER
,并且需要self.LAYOUT_MANAGER
?!
答案 0 :(得分:4)
你说:
只是因为在这个方法中,引用了像POSITION,SIZE等字段而没有任何前缀自我,但是如果我使用字段LAYOUT_MANAGER作为方法SetSizerAndFit ...
从技术上讲,没有。对于POSITION,SIZE等的引用不是 in 方法,它们是在def
行中创建的。 def
行本身可以访问封闭范围,因此它可以看到变量POSITION
和SIZE
,因为它们存在于该封闭范围(即类体)中。但是,该方法的实际主体无权访问此范围,因此您需要使用self。
这种范围的差异与两者执行时的差异相似。 def
语句定义函数,并在源文件中发生时立即执行。在您实际调用函数之前,def
的正文不会被执行。
答案 1 :(得分:0)
默认参数在声明时在其封闭范围内计算,而方法本身在不同范围内计算。