簡體   English   中英

Python - 調用存儲在字典中的 object 的 function

[英]Python - Call a function of an object which is stored in a dict

我有一個 Class ,它創建包含函數字典的對象。 這些函數在 class 中定義。

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'

在另一個文件中,我實例化了前一個 class 的 object,我想運行字典中的一個函數。

from foo import Foo

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

myFunctions.functions[0]()

我有這個錯誤: TypeError: unbound method myFunction1() must be called with Foo 實例作為第一個參數。

我知道當我執行最后一行時,我只是調用 function 而不用 Foo 的 object 作為第一個參數來調用它。 但我不能這樣寫:

myFunctions.myFunctions.functions[0]()

如何調用存儲在 dict 屬性中的 class 的 function ?

我不太明白你想用這個函數字典實現什么,但請注意instance.function()等效於Class.function(instance) 在前者中, instance作為self參數隱式傳遞; 在后者中,您明確地傳遞它。

因此,您可以嘗試以下操作。

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

您可以將函數作為字典調用,如下所示:

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

如果您需要一個對象方法,最好的方法是編寫另一個將調用正確函數的函數

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

這是在功能之間切換的最簡單方法:

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

對於下一位讀者,我建議您閱讀https://stackoverflow.com/a/32284348/13213188

幫助使用存儲在字典中的 class 函數,無需創建任何實例

暫無
暫無

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

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