0

while ループを使用して別のファイルのクラスから関数を呼び出し、元の関数が返したものに基づいて次に呼び出される関数を変更しようとしています。これについては、「Learning Python the Hard Way」からわかるかもしれません。

engine.py と rooms.py の 2 つのファイルがあります。Engine.py には、rooms.py の「Rooms」というクラスから関数を呼び出す while ループが含まれています。

rooms.py の例:

class Rooms(object):    
    def __init__(self): #add start as arg for one class game
        from random import randint
        from sys import exit

    def princess_lives_here(self):
        print "Cake"

        eat_it = raw_input("1\n2\n3\?> ")

        if eat_it == "1":
            return 'death'

        elif eat_it == "2":
            return 'death'

        elif eat_it == "3":
            return 'gold_koi_pond'

        else:
            return 'death'

これは、メカニズムが正しく動作することを確認するための実際のゲームの簡単なモックアップです。「death」と「gold_koi_pond」はすべて、クラス ルームに含まれる関数です。

比較したいエンジンのサンプルが 3 つあります。それらをそれぞれ1、2、3と呼びます。

#1作品:

class Engine(object):
    def __init__(self, start):
        self.start = start

    def play(self):
        next = self.start

        while True:
            g = Rooms()
            room = getattr(Rooms, next)
            next = room(g)


from rooms import Rooms

a = Engine("princess_lives_here")
a.play()

#2作品:

class Engine(object):
    def __init__(self, start):
         self.start = start

    def play(self):
         next = self.start

        while True:
             next = getattr(Rooms, next)(Rooms())


from rooms import Rooms

a = Engine("princess_lives_here")
a.play()

#3は機能しません:

class Engine(object):
    def __init__(self, start):
        self.start = start

    def play(self):
        next = self.start

        while True:
            room = getattr(Rooms, next)
            next = room()


from rooms import Rooms

a = Engine("princess_lives_here")
a.play()

3 つのオプションの違いを理解するのに苦労しています。一方が他方よりも優れていますか?1 と 2 は機能するが 3 は機能しない Python で正確に何が起こっているのでしょうか? 私がやりたいことを達成するためのより良い方法はありますか?

また、rooms が engine.py から実行されている場合、randint と exit はインポートされません。どうしてこれなの?

助けてくれてありがとう!興味のある質問だけでなく、あらゆるアドバイスや批評を受け入れます。

4

1 に答える 1