我正在阅读一些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)
我的问题很简单:如果我引用布局管理器,为什么会得到NameError: global name 'LAYOUT_MANAGER' is not defined
,如下所示:
self.SetSizerAndFit(LAYOUT_MANAGER)
删除self
引用,即。你知道吗
我为什么困惑?仅仅是因为在这个方法中,引用了POSITION
、SIZE
等字段,没有任何前缀self
,但是如果我使用字段布局管理器作为方法SetSizerAndFit
的参数,则需要引用。。。你知道吗
什么给了我?!你知道吗
我可能忘了这里最自然的语言范围/可见性规则。。但考虑到我所知甚少,能写size = SIZE
(没有self.
)却不能只写LAYOUT_MANAGER
,需要self.LAYOUT_MANAGER
是没有意义的?!你知道吗
你说:
从技术上讲,没有。对位置、大小等的引用不是在方法内部,而是在
def
行中。def
行本身可以访问封闭作用域,因此它可以看到变量POSITION
和SIZE
,因为它们存在于封闭作用域(类主体)中。但是,方法的实际主体没有访问此范围的权限,因此需要使用self。你知道吗这个范围上的差异与执行这两个的时间上的差异是平行的。
def
语句定义函数,当函数发生在源文件中时立即执行。在实际调用函数之前,不会执行def
的主体。你知道吗默认参数在声明时在其封闭范围内进行求值,而methods本身在另一个范围内进行求值。你知道吗
相关问题 更多 >
编程相关推荐