2

クラスとオブジェクトを使用してPythonで問題が発生しています。2 つのクラスがあり、それぞれのオブジェクトをインスタンス化しました。ユーザーが特定の文字列を入力したときに、これらのオブジェクトを関数に渡したいと思います。次に、この関数は、受け取るオブジェクトのクラス メソッドを呼び出します。(メソッドは各クラスで同じ名前を持ちます)。以下のサンプルファイルを作成しました。

    class Test1(object):

       def method1(self):
          print("test1")

    class Test2(object):

       def method1(self):
          print("test2")


    def Call(something):
       return something.method1

    def Call2(something):
       y = input("> ")
       return something.method1

    array = [Test1(), Test2()]
    my_dict = {'call': Call(array[0]), 'call2': Call2(array[1])}


    x = input("> ")

    if x in my_dict:
       my_dict[x]()

私が思うに、実行時に Call2() が呼び出され、入力を求められます。次に、2 番目の input() が呼び出されます。if ステートメントが文字列を評価する機会がない場合でも Call2() が実行される理由を誰かが説明できますか? 誤解している部分も多々あるかと思います。どんな助けでも大歓迎です。

編集:さて、dictの宣言中に関数が呼び出されることを理解しています。オブジェクトを dict に渡しながら、関数を dict にリンクするにはどうすればよいでしょうか?

4

4 に答える 4

2

Call2()Q: if ステートメントが文字列を評価する機会を得られない場合でも実行される理由を誰か説明してもらえますか?

ここで両方の関数を呼び出しています。

my_dict = {'call': Call(array[0]), 'call2': Call2(array[1])}

Q: オブジェクトを dict に渡しながら関数を dict にリンクするにはどうすればよいですか?

通常行われるのは、関数と引数を互いに分離して提供することです。次に例を示します。

>>> def the_caller(f, args=()):
...     return f(*args)
... 
>>> def present_me(name):
...     return 'My name is ' + name
... 
>>> the_caller(present_me, args=('Rik',))
'My name is Rik'

あなたのサンプル コードは、意味のあるものを構築するにはあまりにも設計が悪いです。

于 2012-04-19T22:28:32.393 に答える
1

あなたのコードは、辞書を定義するときに関数を呼び出します。

my_dict = {'call': (lambda: Call(array[0])), 'call2': (lambda: Call2(array[1]))}
于 2012-04-19T22:28:12.610 に答える
0

元のコードを使用して、多くの余分なものを打ちのめすと、これはあなたがやろうとしていることをするはずです:

class Test1(object):

   def method1(self):
      print("test1")

class Test2(object):

   def method1(self):
      print("test2")

my_dict = {'call': Test1(), 'call2': Test2()}

x = input("> ")

if x in my_dict:
   my_dict[x].method1()
于 2012-04-19T22:44:43.850 に答える