Python 通过字符串调用类方法或方法

  • 问题描述

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

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')
<function a at 0x000002C526C81C80>
>>> 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
>>> 

 

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

Tips:尽量不要使用eval函数,因为eval is evil。使用这个函数是不安全的,自己用还好,但如果是搭建了个服务器什么的,别有用心的人上传上来恶意代码,你的程序用eval一执行,那岂不是GG ?

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值