【问题标题】:Python - passing objects of different classes into functionsPython - 将不同类的对象传递给函数
【发布时间】:2012-05-01 12:52:45
【问题描述】:

我在使用类和对象的 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?

【问题讨论】:

    标签: python class object dictionary


    【解决方案1】:

    您的代码在定义字典时调用该函数。

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

    【讨论】:

      【解决方案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'
      

      您的示例代码设计得太糟糕,无法构建有意义的东西。

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

        • 有道理,谢谢。我只需要一种在字典中声明它而不调用它的方法。
        • @user1343005,如果我理解正确,您希望将函数绑定到特定参数而不调用函数。一种方法是创建一个新函数,使用lambda,如下所示:my_dict = {'call': lambda: Call(array[0]), 'call2': lambda: Call2(array[1])}。见here
        【解决方案4】:

        使用您的原始代码并删除了许多额外的东西,这应该可以满足您的要求:

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

        【讨论】:

        • 谢谢,但我的目的是让字符串告诉对象调用哪个方法。所以后面的事件可以改变对象,然后字符串将链接到新对象,调用同名的方法
        猜你喜欢
        • 2015-07-07
        • 1970-01-01
        • 2015-09-04
        • 2018-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        • 2021-01-01
        相关资源
        最近更新 更多