Python名称可见性

时间:2013-02-26 19:11:00

标签: python wxpython

我正在阅读一些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引用,即。

为什么我感到困惑?只是因为在这种方法中,引用了POSITIONSIZE等字段而没有任何前缀self,但如果我使用字段LAYOUT_MANAGER作为参数,则需要引用方法SetSizerAndFit ...

是什么给了什么?!

我可能忘记了这里最自然的语言范围/可见性规则..但是鉴于我知道的很少,能够写size = SIZE没有self.是没有意义的。 })但不能只写LAYOUT_MANAGER,并且需要self.LAYOUT_MANAGER?!

2 个答案:

答案 0 :(得分:4)

你说:

  

只是因为在这个方法中,引用了像POSITION,SIZE等字段而没有任何前缀自我,但是如果我使用字段LAYOUT_MANAGER作为方法SetSizerAndFit ...

从技术上讲,没有。对于POSITION,SIZE等的引用不是 in 方法,它们是在def行中创建的。 def行本身可以访问封闭范围,因此它可以看到变量POSITIONSIZE,因为它们存在于该封闭范围(即类体)中。但是,该方法的实际主体无权访问此范围,因此您需要使用self。

这种范围的差异与两者执行时的差异相似。 def语句定义函数,并在源文件中发生时立即执行。在您实际调用函数之前,def的正文不会被执行。

答案 1 :(得分:0)

默认参数在声明时在其封闭范围内计算,而方法本身在不同范围内计算。