python--根据字符串调用类方法或函数

本文作者使用的python版本为: python 3.5.1


根据字符串调用类方法

使用python内置函数getattr可实现。

getattr函数输入一个类对象和一个字符串,返回与字符串同名的类对象的属性。


该函数原型为: getattr(object, name[, default])

object :类的对象

name : 类属性名对应的字符串

default :可选项,当name对应的属性不存在时:如果输入了default参数,返回default;否则产生AttributeError异常。

若name对应的属性存在,该函数返回该属性。


示例:

class example:
    def __init__(self):
        self.member = 0

    def func(self):
        pass

对于该类执行如下语句:

e = example()

member = getattr(e, 'member', None)
func = getattr(e, 'func', None)

print('member is :' + str(member))
func()

通过调用getattr函数,使得:member = e.member,func  = e.func

运行出的结果为:

member is :0
this is a func


当我们只想获取类方法,而不获取类成员变量时,通过类内置变量__dict__来处理。

__dict__是一个字典,其key值是类成员变量名对应的字符串,其value值是成员变量的值。

打印上述类的__dict__:

e = example()
print(e.__dict__)

结果如下:

{'member': 0}

因此可以用如下函数实现只获取类对象的方法的功能:

def call_class_func(object, func_name):
    assert isinstance(func_name, str), 'func_name must be a string'
    if func_name not in object.__dict__:
        func = getattr(object, func_name, None)
        if func is not None:
            func()
            return
    print('object dont have function ' + func_name)


根据字符串调用函数

可以使用内置函数eval实现这个功能。

eval函数输入一个字符串,将这个字符串解析成一个python表达式并执行。


该函数原型为:eval(expression, globals=None, locals=None)

expression:字符串形式表达式

globals :可选项,必须是字典。为表达式提供全局命名空间。

locals :可选项,可以是任何的映射类型的对象。为表达式提供局部命名空间。

globals和locals都缺省时,表达式使用当前环境的全局命名空间和局部命名空间。当只有locals缺省时,locals默认指向globals。


示例:

member = 0
def func():
    print('this is a func')

eval("print('member is :' + str(member))")
eval("func()")

输出结果为:

member is :0
this is a func

eval功能不安全,慎用


欢迎批评指正!


猜你喜欢

转载自blog.csdn.net/iampsz/article/details/80343489