在Python中使用字符串调用类函数
所以基本上我尝试使用字符串调用类中的函数。因此,通常,如果您创建一个类,您可以调用如下所示的函数:在Python中使用字符串调用类函数,python,string,oop,Python,String,Oop,所以基本上我尝试使用字符串调用类中的函数。因此,通常,如果您创建一个类,您可以调用如下所示的函数: class Example: def __init__(self, name, address): self.name = name self.address = address def test1(self): print(self.name) def test2(self): print(self.a
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()
input_user = "test1"
exm.input_user()
这当然很好,但我正在使用大量字符串编写更大的代码,并尝试使用字符串调用类中的函数。假设您有一个字符串为“test1”的变量,然后尝试调用该函数,如下所示:
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()
input_user = "test1"
exm.input_user()
这不起作用,因为Python不将其识别为类的属性。如果我使用一个不在类中的普通函数,我将能够使用globals()函数的字符串调用它
def test1():
print("Succes!")
func = "test1"
call = globals()[func]
call()
但是如果我尝试使用相同的方法在类中调用我的函数,那么我会得到一个keyrerror。使用以下代码:
input_user = "exm.test1"
call = globals()[input_user]
call()
有人能解决这个问题吗?任何帮助都将不胜感激。提前谢谢你 使用
getattr
input_user = "test1"
getattr(exm, input_user)()
或者,使用operator.methodcaller
from operator import methodcaller
methodcaller(input_user)(exm)
尝试将类对象存储在字典中,以便在这个
class_dictionary={'exm':示例(“from function”,'0x00')}user_input=“exm.test1”input_user_list=user_input.split(.“”)类名称,函数_name=input_user_list[0],input_user_list[1]上使用更动态的方法func=getattr(class_dictionary[“exm”],function_name)func()
@chepner但这样我只能将属性作为字符串而不是实际对象。还是我看错了?我在发布这篇文章时忽略了你问题的结尾,但我想问你为什么一开始就这样解压字符串。为什么你的用户输入包括变量名?@chepner,因为在我的真实代码中,我有很多相互交织的类和对象。我想创建一个函数,您可以在其中放入一个字符串,它扫描所有不同的类,并返回所有匹配对象和属性的名称。我问的问题是我在尝试创建此函数时发现的第一个问题(exm,“test1”)
而不是“exm.test1”
有什么问题?唯一需要通过纯字符串与代码通信的实体是那些首先不应该知道名为exm
的变量的实体。这只是我尝试做的一个小例子。当我扫描对象的属性时,它会重新运行字符串。然后我想组合所有的字符串来创建一个指向正确对象的路径。例如,如果我想要路径'obj1.obj2.obj3.obj4',我将以字符串形式获取所有这些obj值。所以我想找出一种组合字符串并让它们调用函数的方法我的简短回答是,不要使用那样的字符串。你到底想解决什么问题,你认为这就是解决方案?