zoukankan      html  css  js  c++  java
  • Python3通过函数名调用函数的几种场景实现

    一、说明

    之前写了一篇“Python执行系统命令教程”讲了如何执行系统命令。

    除了执行系统命令外,我们有时还需要动态地执行一些python代码,有经验的朋友就会知道可以使用内置函数eval实现这一需求,如eval("print(__file__)"),这还是比较简单的。

    但如果要动态执行一个函数,讲的资料就会少一点,这次就要看这个需求该如何实现。

    二、通过eval实现

    2.1 通过eval调用同一个类内的函数

    class TestA:
        def __init__(self):
            self.config_dict = {
                "be_called_function_name": "self.be_called_function()",
            }
            pass
    
        def active_call_function(self):
            print("here is active_call_function.")
            be_called_function_name = self.config_dict["be_called_function_name"]
            # 就直接调用。如果有其他参数,一样地传就好了
            # 另外也可以是"be_called_function_name"是"be_called_function",然后eval(be_called_function_name)()
            eval(be_called_function_name)
            pass
    
        def be_called_function(self):
            print("here is be_called_function.")
    
    if __name__ == "__main__":
        obj = TestA()
        obj.active_call_function()
    View Code

    2.2 通过eval调用同一个文件内的一级函数

    class TestA:
        def __init__(self):
            self.config_dict = {
                "be_called_function_name": "be_called_function()",
            }
            pass
    
        def active_call_function(self):
            print("here is active_call_function.")
            be_called_function_name = self.config_dict["be_called_function_name"]
            # 就直接调用。如果有其他参数,一样地传就好了
            # 另外也可以是"be_called_function_name"是"be_called_function",然后eval(be_called_function_name)()
            eval(be_called_function_name)
            pass
    
    def be_called_function():
        print("here is be_called_function.")
    
    if __name__ == "__main__":
        obj = TestA()
        obj.active_call_function()
    View Code

    三、通过getattr实现

    3.1 通过函数名调用同一个类内的函数

    class TestA:
        def __init__(self):
            self.config_dict = {
                "be_called_function_name": "be_called_function",
            }
            pass
    
        def active_call_function(self):
            print("here is active_call_function.")
            # getaattr(module_name, function_name),module_name传self即可
            be_called_function = getattr(self, self.config_dict["be_called_function_name"])
            # 就直接调用。如果有其他参数,一样地传就好了
            be_called_function()
            pass
    
        def be_called_function(self):
            print("here is be_called_function.")
    
    
    if __name__ == "__main__":
        obj = TestA()
        obj.active_call_function()
    View Code

    3.2 通过函数名调用其他类的函数

    class TestA:
        def __init__(self):
            self.config_dict = {
                "be_called_function_name": "be_called_function",
            }
            pass
    
        def active_call_function(self):
            print("here is active_call_function.")
            # getaattr(module_name, function_name),module_name传被调用的函数所在的类的类实例
            testb_obj = TestB()
            be_called_function = getattr(testb_obj, self.config_dict["be_called_function_name"])
            # 就直接调用。如果有其他参数,一样地传就好了
            be_called_function()
            pass
    
    
    class TestB:
        def be_called_function(self):
            print("here is be_called_function.")
    
    
    if __name__ == "__main__":
        obj = TestA()
        obj.active_call_function()
    View Code

    3.3 通过函数名调用同文件的一级函数

    import sys
    
    
    class TestA:
        def __init__(self):
            self.config_dict = {
                "be_called_function_name": "be_called_function",
            }
            pass
    
        def active_call_function(self):
            print("here is active_call_function.")
            # getaattr(module_name, function_name),module_name传当前模块名
            module_name = sys.modules['__main__']
            be_called_function = getattr(module_name, self.config_dict["be_called_function_name"])
            # 就直接调用。如果有其他参数,一样地传就好了
            be_called_function()
            pass
    
    
    def be_called_function():
        print("here is be_called_function.")
    
    
    if __name__ == "__main__":
        obj = TestA()
        obj.active_call_function()
    View Code

    3.4 通过函数名调用在其他文件的一级函数

    class TestA:
        def __init__(self):
            self.config_dict = {
                "be_called_function_name": "be_called_function",
            }
            pass
    
        def active_call_function(self):
            print("here is active_call_function.")
            # getaattr(module_name, function_name),module_name传函数所在模块名
            # __import__()传函数所在文件
            module_name = __import__("test_call_function_by_string1")
            be_called_function = getattr(module_name, self.config_dict["be_called_function_name"])
            # 就直接调用。如果有其他参数,一样地传就好了
            be_called_function()
            pass
    
    
    if __name__ == "__main__":
        obj = TestA()
        obj.active_call_function()
    View Code
  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/lsdb/p/13294495.html
Copyright © 2011-2022 走看看