簡體   English   中英

Python:我可以在字典中將字符串作為鍵和函數作為值嗎?

[英]Python: Can I have a string as a key and a function as value in a dictionary?

換句話說,這是否真的給我錯誤,因為它實際上是不可能的,或者我只是寫錯了:

class someClass:

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

因此,如果functionInClass接受一個參數,我想從類中的任何地方調用它:

self.myMap[self.myString](theArgument)

這只是產生:

NameError: name 'self' is not defined

任何幫助,將不勝感激。

是的,你可以這樣做,因為方法(或綁定方法)本身就是對象。

在你的代碼中你忘了你的功能。 我想你想寫這樣的東西:

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

    def functionInClass(self):
        pass

這完全有效。

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

這個測試代碼不使用類,但同樣的事情也可以用類來完成。 錯誤顯示self未定義,它與字典中的函數無關。

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

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)

你的代碼應該有效。 可能你只是忘記了什么。 這對我很有用:

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

如果希望myMap成為類屬性,請將dict值設為方法的字符串名稱,並使用getattr檢索實際方法:

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

x = SomeClass()
getattr(x,x.myMap['someString'])('argument')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM