2012-04-19 97 views
1

我在類和對象的python中遇到了一些麻煩。我有兩個類,並且我實例化了每個類的一個對象。我想在用戶鍵入某個字符串時將這些對象傳遞給函數。該函數然後會調用它所需的對象的類方法。 (這些方法對於每個類都有相同的名稱)。我做了一個示例文件如下:Python - 將不同類的對象傳遞給函數

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()在運行時被調用並要求輸入。然後第二個輸入()被調用。有人可以解釋爲什麼即使if語句沒有機會評估字符串,Call2()也會運行嗎?可能有很多我誤解的東西。任何幫助表示讚賞。

編輯:好的,我明白在dict的聲明期間調用函數。你如何將一個函數連接到字典,同時仍然將對象傳遞給它?

回答

1

當你運行它,它會得到這一行:

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

,將調用CallCall2 - 這是第input被稱爲地方(你可以看到這一點,如果你改變你的input提示以東西爲每一個不同的,所以你可以告訴被調用哪一個(即而非"> ")。

這是否澄清的事情,或者是不同的東西你不理解?

+0

這很有道理,謝謝。我只需要一種方法來在dict中聲明它,而不用調用它。 – Ci3 2012-04-19 22:35:16

+1

@ user1343005,如果我理解你正確,你希望將函數綁定到特定的參數而不用調用函數。一種方法是創建一個新函數,使用'lambda'就像這樣:'my_dict = {'call':lambda:Call(array [0]),'call2':lambda:Call2(array [1]) }'。請參閱[這裏](http://stackoverflow.com/a/10237755/577088)。 – senderle 2012-04-19 22:42:24

1

您的代碼在定義字典時調用該函數。

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

謝謝你,我沒有了解拉姆達到現在爲止! – Ci3 2012-04-19 22:56:19

2

問:有人能解釋爲什麼Call2()運行即使if語句沒有得到一個機會來評估一個字符串?

你在這裏調用這兩個函數:

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

問:你怎麼會去功能鏈接到字典,同時還傳遞對象呢?

通常做的是提供函數和args sepatate彼此。這裏有一個例子:

>>> 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' 

你的示例代碼太糟糕了,旨在構建一些可能有意義的東西。

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() 
+0

謝謝,但我的目的是字符串告訴哪個方法調用對象。因此,稍後事件可以更改對象,然後將字符串鏈接到新對象,調用具有相同名稱的方法 – Ci3 2012-04-19 22:55:59