【问题标题】:Calling a class function using strings in Python [duplicate]在Python中使用字符串调用类函数[重复]
【发布时间】:2020-03-30 20:32:24
【问题描述】:

所以基本上我正在尝试使用字符串调用类中的函数。所以通常如果你创建一个类,你可以调用如下所示的函数:

class Example:

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

    def test1(self):
        print(self.name)

    def test2(self):
        print(self.address)


exm = Example("exm", 0x00)
exm.test1()
exm.test2()

这当然可以,但我正在使用大量字符串编写更大的代码,并且我正在尝试使用我的字符串调用类中的函数。假设您有一个带有字符串“test1”的变量,然后尝试调用该函数,如下所示:

input_user = "test1"
exm.input_user()

这不起作用,因为 Python 不将其识别为类的属性。如果我使用不在类中的普通函数,我将能够使用带有 globals() 函数的字符串来调用它。

def test1():
    print("Succes!")


func = "test1"
call = globals()[func]
call()

但是,如果我尝试使用相同的方法在类中调用我的函数,则会收到 KeyError。使用下面的代码:

input_user = "exm.test1"
call = globals()[input_user]
call()

有人对此有解决方案吗?任何帮助将不胜感激。提前谢谢!

【问题讨论】:

  • 为什么你的用户输入包含变量名?
  • @chepner 因为在我的真实代码中,我有很多交织在一起的类和对象。我想创建一个函数,您可以在其中放入一个字符串,它会扫描所有不同的类并返回所有匹配对象和属性的名称。我问的问题是我在尝试创建这个函数时发现的第一个问题
  • (exm, "test1") 而不是"exm.test1" 有什么问题?唯一需要通过纯字符串与您的代码进行通信的实体是那些首先不应该知道名为 exm 的变量的实体。
  • 这只是我正在尝试做的一个小例子。当我扫描对象的属性时,它会返回字符串。那么我想组合所有的字符串来创建一个正确对象的路径。因此,例如,如果我想要路径“obj1.obj2.obj3.obj4”,我将在字符串中获取所有这些 obj 值。所以我试图找出一种方法来组合字符串并让它们调用一个函数
  • 我的简短回答是,不要使用这样的字符串。您认为这是解决方案的实际问题是什么?

标签: python string oop


【解决方案1】:

使用getattr

input_user = "test1"
getattr(exm, input_user)()

或者,使用operator.methodcaller

from operator import methodcaller

methodcaller(input_user)(exm)

【讨论】:

  • 尝试将类对象存储在字典中,以便在此 class_dictionary = { 'exm': Example("from function", '0x00') } user_input = "exm.test1" input_user_list = user_input.split(".") classname, function_name = input_user_list[0], input_user_list[1] func = getattr(class_dictionary["exm"], function_name) func() 上使用更动态的方法
  • @chepner 但是这样我只能将属性作为字符串而不是实际对象。还是我看错了?
  • 当我发布这个问题时,我忽略了你的问题的结尾,但我质疑你为什么一开始就没有解析这样的字符串。
猜你喜欢
  • 2011-05-07
  • 2018-06-21
  • 2011-12-17
  • 2015-04-06
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 2018-12-23
相关资源
最近更新 更多