暴露类的内部方法,并使用它们

时间:2014-03-07 23:32:47

标签: python python-2.7

假设我有一个类似的课程:

class Shell:
  def cat(self, file):
    try:
      with open(file, 'r') as f:
        print f.read()
     except IOError:
      raise IOError('invalid file location: {}'.format(f))
   def echo(self, message):
     print message
   def ls(self, path):
     print os.listdir(path)

在javascript环境中,您可以执行"Class"[method_name]()之类的操作,具体取决于事物的结构。我在python中寻找类似的东西,使其成为“模拟操作系统”。 EG:

import os
def runShell(user_name):
  user_input = None
  shell = Shell()
  while(user_input != 'exit' or user_input != 'quit'):
    user_input = raw_input('$'+ user_name + ': ')
    ...

现在,我们的想法是他们可以输入类似的东西......

$crow: cat ../my_text

......在幕后,我们得到了这个:

shell.cat('../my_text')

同样,我希望能够在键入help时打印该类中存在的所有方法定义。 EG:

$crow: help\n
> cat (file)
> echo (message)
> ls (path)

在python中是可以实现的吗?

1 个答案:

答案 0 :(得分:1)

您可以使用内置函数vars来公开对象的所有成员。这可能是为用户列出这些内容的最简单方法。如果您只打算打印到stdout,也可以拨打help(shell),这会打印您的班级成员以及文档字符串等。 help实际上只适用于交互式解释器,因此您可能最好使用vars编写自己的帮助输出器,并将__doc__属性神奇地添加到对象中文档字符串。例如:

class Shell(object):
    def m(self):
        '''Docstring of C#m.'''
        return 1
    def t(self, a):
        '''Docstring of C#t'''
        return 2

for name, obj in dict(vars(Shell)).items():
    if not name.startswith('__'): #filter builtins
        print(name, '::', obj.__doc__)

要挑选并执行对象的特定方法,可以使用getattr,它按名称从对象中获取属性(如果存在)。例如,要选择并运行不带参数的简单函数:

fname = raw_input()
if hasattr(shell, fname):
    func = getattr(shell, fname)
    result = func()
else:
    print('That function is not defined.')

当然,您可以先将用户输入标记为根据需要将参数传递给您的函数,例如您的cat示例:

user_input = raw_input().split() # tokenize
fname, *args = user_input #This use of *args syntax is not available prior to Py3
if hasattr(shell, fname):
    func = getattr(shell, fname)
    result = func(*args) #The *args syntax here is available back to at least 2.6
else:
    print('That function is not defined.')