0

このコードはチュートリアルから作成しましたが、重要な概念を理解するのに苦労しています。「next」はどのようにして文字列「s」と等しくなるのですか? self.start はその文字列をどのように参照しますか?

import sys

class DemoClass(object): 

    def __init__(self, start): # executes once!
        self.start = start
        print "_init_"

    def play(self):            # executes once!
        next = self.start
        print "next"

        while True:
            attr = getattr(self, next)  #get attribute of the class
            next = attr()

    def s(self):              # these methods start calling each other once executed
        print "s"
        return 't'

    def t(self):
        print "t"
        i = raw_input(">")
        if i == 's':          # if user input 'i' is equal to 's', call func "s"
            return "s"
        elif i == 'v':
            return "v"
        else:
            exit(0)

    def v(self):
        print "v"
        return 's'  


a = DemoClass("s")
a.play()
4

4 に答える 4

2

初めてクラスを初期化するときは、エントリ ポイントを関数 spaghetti に設定します。 play()次に、何があったかに基づいて実行チェーンを開始しますstartgetattr(self, next)は実際にその名前のクラス メンバーへの参照を取得し、next=attr()によって返されたメンバーを呼び出し、getattrその呼び出しから返された値を に代入しますnext

メソッドに関しては、next が s のときsに実行され、次にnextttが取得されて実行されます。 tこれはraw_input、ユーザーが次の通話を制御できることを意味します。ユーザーが「s」tを入力すると「s」が返され、「v」と入力された場合は「v」tが返され、それ以外の場合はプログラムが終了します。 にループバックするvだけです。plays

これは、プログラムをこのように構造化する必要がある理由についての文脈のない、ナンセンスなロジックの集まりのようなものです。

于 2012-05-14T18:16:21.380 に答える
1

あなたの最初の質問に対して: sgetattrはインスタンスの属性を返します。この場合はメソッドattr()です。

于 2012-05-14T18:16:11.100 に答える
1

あなたのコードは多少わかりにくいと思いますが、基本的にここで起こっていることは、Python クラスの機能に関係しています。Python 関数はローカルにスコープが設定されているため、クラス オブジェクト自体を変更するために、クラスのすべてのメソッドは最初の引数として、'self' と呼ばれる慣習によりクラス自体を受け取ります。このオブジェクトには、すべての変数とメソッドが属性として含まれています。

__init__そのクラスのインスタンスを宣言するときに呼び出される特別な関数もあります。これもself最初の引数として取り、次に必要な他のカスタム引数を取ります。

あなたの質問に関しては、次の簡略化されたコードが's'に割り当てられる方法ですnext:

class DemoClass(object):

  def __init__(self, the_input):
    # The input on the class declaration is assigned to the 
    #  class attribute 'start'
    self.start = the_input

  def play(self):
    self.next = self.start


  joe = DemoClass('s')
  print joe.start # prints 's'

  print joe.next # raises error, since joe.next hasn't been defined  

  joe.play()
  print joe.next # also prints 's', now that self.next has been defined
于 2012-05-14T18:20:29.950 に答える
1

「next」が文字列「s」と等しくなる方法

オブジェクトメソッドが呼び出されるたびに、メソッドの最初のパラメーターが自動的にオブジェクト自体に設定されます。一般的に と呼ばれselfます。

を実行するとa = DemoClass("s")DemoClass::__init__がパラメータselfおよびで呼び出されます's'。次ににself.start = start割り当て's'ますself.start

を呼び出すa.play()と、オブジェクトが最初のパラメータとして に送信されますplaynext = self.startに割り当てself.startられたものを に's'割り当て__init__ますnext

于 2012-05-14T18:20:41.103 に答える