0

同様の質問がここで尋ねられました。ただし、プログラムの一部がどのように機能するかを理解するのには、あまり役に立ちませんでした。プログラムは次のとおりです。

from sys import exit
from random import randint

class Game(object):

    def __init__(self, start):
        self.pie = [ 'pie test']

        self.start = start

    def play(self):
        next_room_name = self.start
        while True:
            print "\n--------"
            room = getattr(self, next_room_name)
            next_room_name = room()

    def rooom(self):
        print "Test worked. good job"
        return "piez"

    def piez(self):
        print "pie room"
        exit(1)


a_game = Game("rooom")
a_game.play()

最初の質問は、以下がどのように機能するかです。

def play(self):
        next_room_name = self.start

        while True:
            print "\n--------"
            room = getattr(self, next_room_name)
            next_room_name = room()

プログラムが必要な場所に移動できるように、次の方法で部屋の名前を生成していることを知っています。私はそれがどのように起こっているのか見ていません。

私の2番目の質問は次のとおりです。

self.start = start

self.pie が行っていることはある程度理解しています。しかし、 self.start = start が何を達成すると思われるかはわかりません。ご協力いただきありがとうございます。

4

2 に答える 2

1

次のようなクラスがあるとします。

class DummyClass(object):

    awesome = True

    def not_awesome(self):
        self.awesome=False

これに対して getattr を使用することは、ドット構文を使用することとまったく同じです。

dumb = DummyClass()
print getattr(dummy, "awesome") # True
print dummy.awesome # True

これをメソッドでも使用できます。

dumb = DummyClass()
no_more_awesome = getattr(dummy, "not_awesome") # returns the not_awesome method of dummy
print dummy.awesome # True
no_more_awesome()
print dummy.awesome # False

したがって、投稿したコード スニペットでは、getattr(self, next_room_name)名前を持つメソッドを取得し、next_room_name呼び出される関数 (自己にバインド) を返します。事前に名前がわからないため、ここではドット構文の代わりに変数を使用します。これを取得するには、次の 2 つのスニペットを検討してください (オーバーラップで少し混乱します...申し訳ありません)。

dummy = DummyClass()
awesome = "not_awesome"
print dummy.awesome # True
print getattr(dummy, awesome) # string with something like <bound method ... >
于 2012-08-20T00:47:52.390 に答える
0

まず、オブジェクトの初期化。がGame("rooom")呼び出されると、文字列は のパラメータに"rooom"バインドされます。このステートメントは、 からアクセスできる内部オブジェクト ディクショナリに文字列を格納するだけです。start__init__this.start = start"rooom"this.start

次に、play()メソッドが呼び出されます。このコンテキストでの の使用により、 Pluggable Selectorgetattrと呼ばれるパターンが定義されます。つまり、呼び出すメソッドを明示的に指定するのではなく、メソッドの名前が変数として格納されます (この場合)。next_room_name

最初に呼び出されるメソッドはrooom、ローカル変数next_room_name(メソッドのスコープに対してローカル) がwhile ループの前にplay初期化されるためです。self.start

メソッド呼び出しの戻り値はnext_room_name変数の更新に使用されるため、rooom実行後の値は になり"piez"ます。したがって、次に呼び出されるメソッドは になりますpiez

最後に、piez実行時に への呼び出しexit(1)が行われるため、インタープリターは終了し、コードはそれ以上実行されません。この場合、これ以上コードが実行されない理由は、どこにもキャッチされない例外が発生するためです (ドキュメントを参照sys.exit) SystemExit

于 2012-08-20T10:26:58.520 に答える