问题描述

今天遇到个问题,在一个类里面,想要通过字符串调用类里面的方法,即(注意,以下为错误代码演示,只是为了表述问题):

class A(object):def a(self):
print('xxxxx')
def b(self):
c= 'a'
self.c()
test = A()
test.b()

如上面代码所示,在b函数里面,我将字符 a 赋值给了 c ,然后在后面,想要通过 self.c() 的方式,来替代 self.a(),完成对 a 函数的调用。当然,上面的代码毫无疑问的报错了,那么,怎么才能通过字符串调用类里面的函数呢?

解决方法

首先,来解决类里面通过字符串来调用函数的问题,其实也很简单,我们需要用到一个稍微高阶一点的Python自带函数: getattr()

直白的说,这个函数是获取一个实例(也可以说是类)里面的属性或方法。用法为:getattr(object, name[, default])

第一个object参数为: 传入一个实例或者类

第二个name参数为:  你想要获得的这个类或实例里面的属性或方法的名称

第三个参数default为: 如果没有在这个类或实例里面找到对应的属性或方法,应该返回什么。

如果想要详细了解这个内建函数的使用方法,请看:Python getattr() 函数 | 菜鸟教程

这里举个例子:

class A(object):
def a(self):
print('sfsdf')
test = A()
print(getattr(test, 'a', 'None'))
print(getattr(test, 'b', 'None'))

从上面的代码,我们可以看到,getattr()函数获得了 test 实例里面的 a 方法,然后将该方法打印了出来,我们还想获取 test 实例的 b 方法, 但是 test 实例并没有 b 方法,所以就返回了我们预先指定的 None。这就是getattr() 函数的用法。说到这里,相信不少童鞋已经知道怎么通过字符串调用类方法了,完整代码如下:class A(object):

def a(self):
print('GodLordGee')
def b(self):
c= 'a'
func = getattr(self, c, None)
func()
test = A()
test.b()

如上,我们就可以通过字符串,调用类里面的方法了。

也许很多童鞋能够理解这个内建函数的用法,但是却不知道这个函数的实际使用场景,那么我可以在这里给你提供一个使用场景:

你写了一个类,类里面有很多个功能函数,还有一个主函数。在主函数里面,会传进来不同的字符串,这些字符串表示程序想要调用的方法。例如:主函数传进来一个 ‘start’ 字符串,表示程序现在要调用start函数;又过了一会,主函数传进来了一个 'pause' 字符串,表示程序现在想要调用pause函数;再过了一会,主函数传进来了一个‘stop’ 字符串,表示程序现在想要调用stop函数。那么,如上所述的一个过程,我们只需要一个getattr()函数,就可以很方便的调用类里面的各种方法。

扩展知识

知道了如何通过字符串调用类里面的方法,那么,如果通过字符串直接调用方法呢?这里有三个函数可以帮助我们实现这个功能(eval、locals、globals):

>>> def a():
print('I am a')
>>> def b():
print('I am b')
>>> eval('a')
>>> eval('a')()
I am a
>>> eval('b')()
I am b
>>> locals()['a']()
I am a
>>> locals()['b']()
I am b
>>> globals()['a']()
I am a
>>> globals()['b']()
I am b
>>>

相信通过上面的代码,大家已经知道如果通过字符串调用方法了。如果想要详细了解上述三个函数的具体用法,请谷歌百度哦~