Python 如何通过字符串调用方法?
我可以通过组合字符串调用方法来处理数据吗 例如,可以在代码中键入Python 如何通过字符串调用方法?,python,Python,我可以通过组合字符串调用方法来处理数据吗 例如,可以在代码中键入data.image.truecolor() data.image.truecolor() # This line is successful to call method 我的问题是:如果我有一个名为data的数据对象(不是字符串),如何组合“.image.truecolor”调用方法来处理数据 就像: result=getattr(data,".image.truecolor") result() # which is equ
data.image.truecolor()
data.image.truecolor() # This line is successful to call method
我的问题是:如果我有一个名为data的数据对象(不是字符串),如何组合“.image.truecolor”
调用方法来处理数据
就像:
result=getattr(data,".image.truecolor")
result() # which is equivalent to the code above
当然,这是失败的。我得到了一个属性错误
因为处理数据的方法很多,例如:
data.image.fog()
data.image.ir108()
data.image.dnb()
data.image.overview()
# .... and other many methods
手工输入代码既愚蠢又丑陋,不是吗
因此,我希望我可以使用以下代码:
methods=["fog","ir108","dnb","overview"]
for method in methods:
method=".image"+method
result=getattr(data,method) # to call method to process the data
result() # to get the data processed
可以这样做吗?您需要一个两级getattr
:
im = getattr(data, 'image')
result=getattr(im, method)
result()
您可以使用getattr
按名称获取类实例方法,下面是一个示例:
class A():
def print_test(self):
print "test"
a = A()
getattr(a, 'print_test')() # prints 'test'
在您的情况下,将有两个getattr
s,一个用于图像,另一个用于图像方法:
methods=["fog","ir108","dnb","overview"]
image = getattr(data, 'image')
for method in methods:
result = getattr(image, method)
result()
当您知道将调用data.image的方法时,为什么不这样做呢?否则,如果您不知道第二个属性,image
,则必须使用其他答案中建议的两级getattr
。您还可以使用eval(“data.image.fog()”)
,调用/计算字符串中的表达式。如果第一个getattr
的第二个参数是常量,那么它的意义是什么meth=getattr(data.image,method)
会更具可读性。OP问题中(至少对我来说)不清楚“image”部分是否总是常量。他们的代码示例使它看起来非常常量,只是OP希望类似于getattr(data,image.%s”%method)
的东西能够工作(省略要引导的
)。谢谢,但是这种方法不成功。因为最终数据由许多不同的类(包括不同的模块)处理,我仍然通过dataImage=data.image获得AttributeError。但是,我知道如何通过您的帮助来实现。谢谢。对不起……。现在它成功了!因为我使用了“data=data.image”,通过Python的gabarge集合来节省内存空间(我的计算机上有16GB内存,这还不够),它是错误的,所以我猜它也未能分配给不同的变量。但是,我尝试了dataImage=data.image,它成功了!谢谢!
methods=["fog","ir108","dnb","overview"]
dataImage = data.image
for method in methods:
result = getattr(dataImage ,method) # to call method to process the data
result() # to get the data processed