众所周知在php中可以用method_exists和call_user_func来检查类中是否有某方法,并调用之。
但python里面似乎没有这么方便的函数。
python里有两个函数,一个是getattr,一个是hasattr可以完成部分功能,但不是全部功能。
我举个例子:

class ls:
    def a(self):
        act = raw_input('input a action: ')
        if hasattr(self, '%s_action' % act):
            return getattr(self, '%s_action' % act)()
        else:
            print "bad function name!!!"

    def nice_action(self):
        print "nice!!"

    def __bad_action(self):
        print "bad!!"

t = ls()
t.a()

定义了一个简单的类,其中有一个a方法,接受一个输入。输入的字符串和"_action"组成一个方法名。先判断这个方法是否在类中,如果在则调用之,如果不在则输出“bad function name!!!”。
那么,我输入nice,这样就会调用nice_action,但如果我输入__bad,就会输出bad function name:
10.jpg
为什么?按道理来说应该输出“bad!!”才对呀?
因为在python中,类中以2个下划线打头的方法都是私有方法,类似于php里的private,而hasattr、getattr这两个函数是不能取得一个类中私有方法的。
也就是说我前面用hasattr判断类中是否存在__bad_action,实际上就返回的false,因为hasattr不能取得私有方法。
所以,我才说这两个函数只能“完成部分功能”,我还是没有找到万能的方式去在python的类中判断某方法是否存在并调用之。可能还是我对py核心实现原理不了解。