【问题标题】:Python - Call a function of an object which is stored in a dictPython - 调用存储在字典中的对象的函数
【发布时间】:2015-02-13 12:11:46
【问题描述】:

我有一个类,它创建包含函数字典的对象。这些函数在类中定义。

class Foo:

    def __init__(self, name, functions):
        self.name = name
        self.functions = functions

    def myFunction1(self):
        print self.name
        return 'foo'

    def myFunction2(self):
        return 'bar'

在另一个文件中,我实例化了前一个类的一个对象,我想运行字典中的一个函数。

from foo import Foo

myFunctions = Foo.('a name', {0 : Foo.myFunction1, 1 : Foo.myFunction2})

myFunctions.functions[0]()

我有这个错误: TypeError: 未绑定的方法 myFunction1() 必须以 Foo 实例作为第一个参数调用。

我知道当我执行最后一行时,我只是调用函数而不用 Foo 的对象作为第一个参数来调用它。但我不能写这个:

myFunctions.myFunctions.functions[0]()

如何调用存储在 dict 属性中的此类的函数?

【问题讨论】:

  • 这里的Foo 是什么?你的意思是它是一个类还是应该是一个实例?您不需要再次解析类上的方法,您已经有一个未绑定的方法(其中包括对Foo 类的引用)。
  • myFunctions.functions[0](myfunctions)?此外,您的作业中不需要foo 模块引用,因为您的from othermodule import name 形式的导入语句将name 添加到当前模块的命名空间。
  • Foo 是我创建 Foo 对象的类。当我创建一个 Foo 对象时,我在myFunctions 属性中存储了该对象应该使用的函数的字典。存储的函数与我的对象在同一个类中定义。我只想使用 dict 调用其中一个函数。

标签: python dictionary


【解决方案1】:

我不太明白你想用这个函数字典实现什么,但请注意instance.function() 等同于Class.function(instance)。在前者中,instance 作为self 参数隐式传递;在后者中,您明确地传递它。

因此,您可以尝试以下方法。

foo = Foo({0 : Foo.myFunction1, 1 : Foo.myFunction2})
print foo.functions[0](foo)

【讨论】:

  • 非常感谢,我用 Foo.functions[0](myFunctions)` (as Class.function(instance) 代替了它,它可以工作。我忘记了这个等价物。
【解决方案2】:

如果你需要一个对象方法,最好的方法是编写另一个函数来调用正确的函数

class Foo:

    def __init__(self, functions):
        self.functions = functions

    def myFunction1(self):
        return 'foo'

    def myFunction2(self):
        return 'bar'

    def run_func(self, func_key, *args, **kwargs):
        func_name = self.functions.get(func_key)
        if func_name and hasattr(self, func_name):
            return getattr(self, func_name)(*args, **kwargs)
        else:
            return None

fun_dict = {0:'myFunction1', 1:'myFunction2'}
a = Foo(fun_dict)
print a.run_func(0)

你甚至可以用这种方式发送参数。

def myFunction1(self, name):
    return name

print a.run_func(0, "test")

这将由 myFunction1 打印 test

【讨论】:

    【解决方案3】:

    您可以像这样将函数调用为字典:

    tmp = Foo()
    tmp.functions={0:tmp.myFunction1, 1:tmp.myFunction2}
    myFunctions = tmp.functions
    print myFunctions.functions[0]()
    

    【讨论】:

    • 当我不通过 self 参数时它可以工作。但我需要使用对象的属性。我编辑了我的问题,使其更全面。
    【解决方案4】:

    这是在功能之间切换的最简单方法:

           dict = {0 : Foo.myFunction1(), 1 : Foo.myFunction2()}
           function = fn_dict.get(0)
           function()
    

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 2014-08-11
      • 2014-03-04
      • 1970-01-01
      • 2020-06-07
      • 2018-08-23
      • 2015-04-14
      • 1970-01-01
      • 2014-10-29
      相关资源
      最近更新 更多