2012-04-19 98 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