Python名称可见性

2024-07-05 11:45:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我为什么困惑?仅仅是因为在这个方法中,引用了POSITIONSIZE等字段,没有任何前缀self,但是如果我使用字段布局管理器作为方法SetSizerAndFit的参数,则需要引用。。。你知道吗

什么给了我?!你知道吗

我可能忘了这里最自然的语言范围/可见性规则。。但考虑到我所知甚少,能写size = SIZE(没有self.)却不能只写LAYOUT_MANAGER,需要self.LAYOUT_MANAGER是没有意义的?!你知道吗


Tags: 代码nameselfsizetitlestylemanagerposition
2条回答

你说:

Simply because in this method, a reference is made to fields like POSITION, SIZE, etc without any prefixed self, yet the reference is needed if I use the field LAYOUT_MANAGER as an argument to the method SetSizerAndFit...

从技术上讲,没有。对位置、大小等的引用不是在方法内部,而是在def行中。def行本身可以访问封闭作用域,因此它可以看到变量POSITIONSIZE,因为它们存在于封闭作用域(类主体)中。但是,方法的实际主体没有访问此范围的权限,因此需要使用self。你知道吗

这个范围上的差异与执行这两个的时间上的差异是平行的。def语句定义函数,当函数发生在源文件中时立即执行。在实际调用函数之前,不会执行def的主体。你知道吗

默认参数在声明时在其封闭范围内进行求值,而methods本身在另一个范围内进行求值。你知道吗

相关问题 更多 >