1

Pythonを学ぶためにwxPythonコードを読んでいます。私は本当に初心者なので、私の質問はあなたには明らかですが、私には不可解であり、質問を完全に理解するために多くのことを教えてくれることを覚えておいてください.

ここにコード:

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私の質問は単純です: LAYOUT_MANAGER を次のように参照すると、なぜ取得するのですか?

self.SetSizerAndFit(LAYOUT_MANAGER)

selfつまり、参照を削除します。

なぜ私は混乱しているのですか?このメソッドではPOSITIONSIZE、 などのフィールドへの参照が接頭辞なしで行わselfれるため、 LAYOUT_MANAGER フィールドをメソッドの引数として使用する場合は参照が必要ですSetSizerAndFit...

何が得られる?!

私はおそらく、ここでの言語の最も自然なスコープ/可視性規則を忘れています..しかし、私が知っていることをほとんど考えると、size = SIZE( no なしでself.) 書くことができるが、 just LAYOUT_MANAGER、および require self.LAYOUT_MANAGER?を書くことができないことは意味がありません。 !

4

2 に答える 2

4

あなたは言う:

このメソッドでは、接頭辞selfなしでPOSITION、SIZEなどのフィールドが参照されますが、フィールドLAYOUT_MANAGERをメソッドSetSizerAndFit ...の引数として使用する場合は、参照が必要です。

技術的にはありません。POSITION、SIZEなどへの参照は、メソッドdefでは行われず、行で行われます。行自体はdef囲んでいるスコープにアクセスできるので、変数POSITIONを見ることができSIZE、それらはその囲んでいるスコープ(クラス本体)に存在するためです。ただし、メソッドの実際の本体はこのスコープにアクセスできないため、selfを使用する必要があります。

このスコープの違いは、2つが実行されるときの違いと平行しています。このdefステートメントは関数を定義し、ソースファイルで発生したときに実行されます。の本体は、def実際に関数を呼び出すまで実行されません。

于 2013-02-26T19:22:15.263 に答える
0

Default arguments are evaluated at declaration-time, in their enclosing scope, whereas the methos itself is evaluated in a different scope.

于 2013-02-26T19:23:38.867 に答える