gpt4 book ai didi

Python 名称可见性

转载 作者:太空宇宙 更新时间:2023-11-04 10:49:11 24 4
gpt4 key购买 nike

我正在阅读一些 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(with没有 self.) 但不能只写 LAYOUT_MANAGER,需要 self.LAYOUT_MANAGER?!

最佳答案

你说:

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...

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

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

关于Python 名称可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15097303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com