

以下のコードは「独学プログラマー」に掲載されている「戦争」に関するコードですが、疑問に思ったことがあり質問させていただきます。下から二つのクラス内関数が該当箇所です。まだプログラミング初心者でありかなり初歩的なものかもしれませんがよろしくお願いいたします。

`Game` クラスの内部にある `play_game` 関数と `winner` 関数が存在していますが、自分の考えでは何か値を取得する場合には
Python の仕様により該当するものより上にあるものしか取得できないというイメージがあります。

しかし先ほどの二つの関数を確認すると `play_game` 関数の中でその関数よりも下にある `winner` 関数を取得しています。これは class
の中で値を取得しようとしているために起きている現象なのでしょうか？それとも根本的に何か考え方が間違っていますでしょうか？ご教授お願い致します。

[code]

    class Game:
    
        def play_game(self):
            cards = self.deck.cards
            print('Warをはじめます')
            while len(cards) >= 2:
                m = 'qで終了、それ以外のキーでプレイ: '
                response = input(m)
                if response == 'q':
                    break
                self.p1.card = self.deck.draw()
                self.p2.card = self.deck.draw()
                self.print_draw(self.p1, self.p2)
                if self.p1.card > self.p2.card:
                    self.p1.wins += 1
                    self.print_winner(self.p1)
                else:
                    self.p2.wins += 1
                    self.print_winner(self.p2)
        
            win = self.winner(self.p1, self.p2)
            print(('ゲーム終了、{}の勝利です'.format(win)))
        
        def winner(self, p1, p2):
            if p1.wins > p2.wins:
                return p1.name
            if p1.wins < p2.wins:
                return p2.name
            return '引き分け！'
    
[/code]


CC BY-SA 4.0
2021-03-02T08:56:16.013
74361
2021-03-02T09:55:19.763
2021-03-02T09:07:32.983
3060
44180
question
python
関数の定義順と呼び出しに関する疑問


> これは class の中で値を取得しようとしているために起きている現象なのでしょうか？

違います。単なる関数でも同じです。

> それとも根本的に何か考え方が間違っていますでしょうか？

物理的に上に書かれている必要はなく、該当関数呼び出し以前に該当関数が読み込まれていれば問題ありません。

[code]

    def funcA():
        print('funcA')
        funcB()
    
    def funcB():
        print('funcB')
    
    funcA()
    
[/code]

は問題ありませんが

[code]

    def funcA():
        print('funcA')
        funcB()
    
    funcA()
    
    funcA()
    
    def funcB():
        print('funcB')
    
[/code]

は funcA() 内で funcB() 呼び出しができません。


CC BY-SA 4.0
2021-03-02T09:55:19.763
74365
2021-03-02T09:55:19.763
41756
74361
answer