如何动态选择方法调用?
我有一段代码,差不多是这样的:
if command == "print":
foo_obj.print()
if command == "install":
foo_obj.install()
if command == "remove":
foo_obj.remove()
command
是一个字符串(我通过解析命令行参数来定义它,不过这不是重点)。有没有办法把上面的那段代码换成类似这样的东西呢?
foo_obj.function(command)
顺便说一下,我使用的是 Python 2.7。
5 个回答
5
在编程中,有时候我们需要让程序做一些事情,比如计算、显示信息或者处理数据。为了让程序能够理解我们的指令,我们需要用一种特定的语言来编写这些指令。这种语言就叫做编程语言。
编程语言就像我们日常生活中的语言一样,有自己的语法和规则。就像我们说话时需要按照一定的语法结构来表达意思,编程语言也需要遵循特定的格式和规则,才能让计算机明白我们想要它做什么。
在写程序时,我们可能会遇到一些问题,比如程序运行不正常或者出现错误。这时候,我们就需要仔细检查我们的代码,看看哪里出了问题。通常,错误可能是因为拼写错误、语法不正确或者逻辑不清晰造成的。
解决这些问题的过程就叫做调试。调试就像是侦探在寻找线索,帮助我们找到并修复程序中的错误。通过调试,我们可以让程序更顺畅地运行,达到我们想要的效果。
总之,编程就是用特定的语言给计算机下指令,让它完成我们想要的任务。而调试则是帮助我们找出程序中的问题,让它能够正常工作。
self.command_table = {"print":self.print, "install":self.install, "remove":self.remove}
def function(self, command):
self.command_table[command]()
7
使用 getattr
并调用它的结果:
getattr(foo_obj, command)()
可以理解为:
method = getattr(foo_obj, command)
method()
不过,当然了,从用户输入中获取 command
字符串时要小心。你最好用一些方法检查一下这个命令是否被允许,比如:
command in {'print', 'install', 'remove'}
3
核心功能可能是这样的:
fn = getattr(foo_obj, str_command, None)
if callable(fn):
fn()
当然,你应该只允许某些特定的方法:
str_command = ...
#Double-check: only allowed methods and foo_obj must have it!
allowed_commands = ['print', 'install', 'remove']
assert str_command in allowed_commands, "Command '%s' is not allowed"%str_command
fn = getattr(foo_obj, str_command, None)
assert callable(fn), "Command '%s' is invalid"%str_command
#Ok, call it!
fn()