2

我在使用类和对象的 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() 在运行时被调用并要求输入。然后第二个 input() 被调用。有人可以解释为什么即使 if 语句没有机会评估字符串, Call2() 也会运行?可能有很多我误解的事情。任何帮助表示赞赏。

编辑:好的,我知道在声明字典期间调用了这些函数。在将对象传递给它的同时,您将如何将函数链接到 dict?

4

4 回答 4

2

问:有人可以解释为什么Call2()即使 if 语句没有机会评估字符串也会运行吗?

你在这里调用这两个函数:

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

问:您将如何在将对象传递给它的同时将函数链接到字典?

通常所做的是提供功能和参数彼此分离。这是一个例子:

>>> 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 回答
1

当你运行它时,它将到达这一行:

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

这将调用CallCall2- 这是第一个input被调用的位置(如果您将input提示更改为每个不同的提示,您可以看到这一点,这样您就可以知道正在调用哪个(即而不是"> ")。

这是否澄清了事情,还是你不理解的不同?

于 2012-04-19T22:33:25.670 回答
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 回答