Python:我可以在字典中将字符串作为键和函数作为值吗?

时间:2011-10-03 14:37:35

标签: python dictionary

换句话说,这是否真的给我错误,因为它实际上是不可能的,或者我只是写错了:

class someClass:

    self.myString = "Hello"
    self.myMap =  {
    'someString' : self.functionInClass
    }

因此,如果functionInClass接受一个参数,我想从类中的任何地方调用它:

self.myMap[self.myString](theArgument)

这只是产生:

NameError: name 'self' is not defined

任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:3)

是的,你可以这样做,因为方法(或绑定方法)本身只是对象。

在您的代码中,您忘记了自己的功能。我想你想写这样的东西:

class someClass:
    def __init__(self):
        self.myString = "Hello"
        self.myMap =  {
            'someString' : self.functionInClass
        }

    def functionInClass(self):
        pass

答案 1 :(得分:1)

这完全有效。

>>> def f():
...     print "test"
...
>>> d = {'df':f}
>>> d['df']()
test
>>>

此测试代码不使用类,但也可以使用类完成相同的操作。错误显示self未定义,它与字典中的函数无关。

答案 2 :(得分:0)

你要做的事情没有什么是不可能的:

class Test(object):

  def func1(self, arg):
    print 'func1, arg=%s' % arg

  def func2(self, arg, **kwargs):
    print 'func2, arg=%s, kwargs=%s' % (arg, kwargs)

  funcmap = {'func1': func1, 'func2': func2}

  def invoke(self, fname, *args, **kwargs):
    Test.funcmap[fname](self, *args, **kwargs)

test = Test()
test.invoke('func1', 0)
test.invoke('func2', 42, kw=12)

答案 3 :(得分:0)

您的代码应该有效。可能你只是忘记了什么。 这对我很有用:

class someClass:

    def __init__(self):
        self.myString = "someString"
        self.myMap =  {
            'someString' : self.functionInClass
        }   

    def functionInClass(self, argument):
        print argument

    def someMethod(self):
        self.myMap[self.myString]("argument")

cl = someClass()

cl.someMethod()
cl.myMap[cl.myString]("argument")

答案 4 :(得分:0)

如果您希望myMap成为类属性,请将dict值设为方法的字符串名称,并使用getattr检索实际方法:

class SomeClass(object):
    myMap =  {
        'someString' : 'methodInClass'
        }
    def methodInClass(self,argument):
        pass

x = SomeClass()
getattr(x,x.myMap['someString'])('argument')
相关问题