2011-07-07 10 views
3

私は最初のプログラミング言語としてPythonを学び、this online bookを調べています。私の問題は、そのページにある運動に関連しています。クラス内での再生方法の仕組みを理解しています。それは他のすべての方法にどのようにアクセスしていますか? getattrはこのループの中でどのように機能していますか?助けを感謝します!ここでHelp:Python whileループ内のクラス

は、ページを残すことを希望されないものするための方法である:

def play(self): 
    next = self.start 

    while True: 
     print "\n--------" 
     room = getattr(self, next) 
     next = room() 
+0

あなたは本当に難しい方法でPythonを学んでいます。 ;-)公式の[チュートリアル](http://docs.python.org/tutorial/)を使用することをお勧めします。 – Keith

+1

@Keith私は同意しない。難しいのは簡単です;)。 –

答えて

2

どのように動作するか説明しようとします。
まず、これが実行されます。

a_game = Game("central_corridor") 

これはGame.__init__("central_corridor")を呼び出します。
__init__メソッドでは、self.startは値 "central_corridor"をとります。
その後、本体に戻ります。ここまでで、a_gameという変数があります。この変数など、実際にはクラスGameのインスタンスであり、それはa_game.startのようないくつかの特性を有する、a_game.quipsa_game.death()
次に、これが実行されます。

a_game.play() 

a_gameplay()メソッドを呼び出すこと。 Gameではなく、a_gameにあります。したがって、メソッドが実行されているときには、selfという単語(通常の引数のように扱われます)を介して、すべてのプロパティa_gameにアクセスします。

これは

next = self.start 

self.start__init__()で定義された次の実行、および "central_corridor" に等しいです。だから、nextは "central_corridor"です。
while True:ループに入り、いくつかのハイフンを印刷し、getattr()を呼び出します。
getattr()は少なくとも2つの引数をとります。最初のものは、オブジェクトのインスタンスであり、この場合はselfであり、2番目のものは、そのインスタンスの属性ののの名前です。この場合"central_corridor"
getattrは "central_corridor"というselfの属性を探し、それを見つけて返します。今、roomself.central_corridorに等しいです。
次に、next = room()が実行されます。部屋は現在self.central_corridorに等しいので、

next = self.central_corridor() 

が実際に実行されます。

self.central_corridor()は、 "death"、 "laser_weapon_armory"または "central_corridor"のいずれかを返すことができます。 "laser_weapon_armory"を返すとしましょう。今nextは "laser_weapon_armory"です。私たちはループの始めに戻ります。ハイフンをもう一度印刷し、 "laser_weapon_armory"という名前の自己の属性を取得します。この属性はself.laser_weapon_armoryになります。
self.laser_weapon_armoryは、 "the_bridge"または "death"を返すことができます。今回は「死」を返すとしましょう。今nextは「死」です。私たちはループの始めに戻り、いくつかのハイフンを印刷してself.deathにして実行します。

すべてself.deathは、self.quipsのランダムな文字列を印刷し、次にexit(1)を出力します。 sysモジュールからのexit機能は、それだけです。プログラムを終了します。

それはかなりです。私はこれが助けて欲しい

幸運を祈るPythonの難しい方法!

+0

完璧な説明!それは私が確信していなかったことをクリアする。返された値が次に返されること。徹底的に説明する時間をとってくれてありがとう。 – user832799

+0

@userあなたは大歓迎です:)。私はそれが助けてうれしいです。 –

0

GETATTRのpythonから組み込み関数です。 playメソッドは、クラスGameに属するメソッドです。

Trueは、ループが中断するまで永遠に続くことを意味します。

他に何を理解していますか? g = Game() あなたはplayメソッドを呼び出すことができます:あなたは新しいゲームを作成のIg:EDIT

g.play()が、これはあなたにも、このようにそれを呼び出すことができ、意味(自己)を再生するものである:Game.play(g)、それはないです一般。

EDIT2:がGETATTR機能について詳しく読むhere

+0

うーん、どうすれば説明できますか?私はあなたが言ったことを理解していますが、これは私の問題だと思います。私はGame()が最初に実行されるときに、それが__init__を通り、次にそれが実行されるcentral_corridorを使用してplay()メソッドを実行します。私は理解できないことは、メソッドの終わりに何かを返すときです。この何かが返されます。そして、実行中のループの中でこのgotoはどこにありますか?私はどのようにループはすべてのメソッドにアクセスすることができますね?私はちょうど1週間のプログラミングを勉強していただけです:D – user832799

+0

質問を正しく理解していれば、この再生機能には戻り値がありません。戻り値の型が指定されていないときはwhileループは永遠に実行されますそれは "---------"を出力し、変数roomの新しい値を取得し、その値の隣にセットします。 –

+0

これはプログラムではないことを覚えておいてください。これはクラス定義なので、アイドルや他のIDEを実行してゲームインスタンスを作成し、そのメソッドを呼び出すときにこれらのメソッドを呼び出します。 –

1

はこちらをご覧ください:

http://effbot.org/zone/python-getattr.htm

は基本的にgetattr(self, next)nextで名前の属性を返すようにselfオブジェクトを要求します。たとえば、nextが「abc」の場合は、self.abcを呼び出すのと同じです。

1

理由は不明ですが、getattr()が 'next'で指定されている値を実行していることは明らかです。最初は 'start'です。これは 'central_corridor'です。しかし、その関数が完了して値を返すと、room()とgetattr(self、next)のやりとりがその値を取り上げ、対応する関数を 'next'として実行します。

EDIT:

のgetattr()属性の値ではなく、属性自体を得ています。属性の値は、を返すかどうかにかかわらず、ドラムロールです。値を取得するために属性を完全に実行する必要があります。次に属性 'next'が変更され、戻り値が実行された属性... 'next'がgetattr()によって値を取得するために実行されます!サイクルが壊れる「死」か何かが繰り返されるまで繰り返す。

今すぐ取得します。

+0

"私はこれを後でお答えします"と言って質問に答えています。本当に? –

+0

これは私の理解が失敗したところです... – user832799

+0

オックはいくつかのアイデアをテストしていましたが、コードヒットを返すとループから抜けるようになりました。したがって、例えば、私が 'central_corridor'の後の最初のオプションのようにreturn 'death'に到達した場合、ループを終了します。どのようにしてこの「死」の戻り値がメソッドの死に進むのに使用されるのでしょうか? – user832799

0

実際は非常に簡単です。 :)

このように考えてみましょう。 nextには、参照(アドレス)がself.nextに割り当てられます。だからgetaddr(self, next)の場合、次にself.nextという参照があるので、実際にはself.nextのメモリアドレスを要求していますが、これはもちろん属性がselfなので、動作します。

私は少し奇妙に見えます。

あなたのための簡単な例:

>>> a = 'r' 
>>> print '0x%x' % id(a) 
0x7fbe99e204b8 
>>> b = a 
>>> print '0x%x' % id(b) 
0x7fbe99e204b8 

>>> class T(object): pass 
... 
>>> foo = T() 
>>> print '0x%x' % id(foo) 
0x15c6bd0 
>>> bar = foo 
>>> print '0x%x' % id(bar) 
0x15c6bd0 
>>> bar = T() 
>>> print '0x%x' % id(bar) 
0x15c6b90 

だから基本的に別の変数に変数を割り当てるだけでは何も変更せずに、同じオブジェクトを参照します。