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