由swift想到的-python反射机制
2015-01-09 16:42
405 查看
在swift中的命令设置并没有进行字符串的定义,而是使用了python的反射机制,也即,命令参数,是Manager类中的函数名称,先我们将用到的函数列举如下,
函数command函数,是管理服务,也是直接进行命令下发的类,Manager中的成员有的是命令执行函数,而有的则不是,那么就需要进行区分,这里我们使用的是@command进行区分的,使用@command声明的函数就是命令执行函数,同时其函数名称也是命令参数
Manager相关函数如下
现整理代码如下:
函数command函数,是管理服务,也是直接进行命令下发的类,Manager中的成员有的是命令执行函数,而有的则不是,那么就需要进行区分,这里我们使用的是@command进行区分的,使用@command声明的函数就是命令执行函数,同时其函数名称也是命令参数
def command(func): """ Decorator to declare which methods are accessible as commands, commands always return 1 or 0, where 0 should indicate success. :param func: function to make public """ func.publicly_accessible = True @functools.wraps(func) def wrapped(*a, **kw): rv = func(*a, **kw) return 1 if rv else 0 return wrapped
Manager相关函数如下
class Manager(object): @command def status(self, **kwargs): """display status of tracked pids for server """ status = 0 for server in self.servers: status += server.status(**kwargs) return status @command def start(self, **kwargs): """starts a server """ setup_env() status = 0 for server in self.servers: server.launch(**kwargs) if not kwargs.get('daemon', True): for server in self.servers: try: status += server.interact(**kwargs) except KeyboardInterrupt: print _('\nuser quit') self.stop(**kwargs) break elif kwargs.get('wait', True): for server in self.servers: status += server.wait(**kwargs) return status ... def list_commands(cls): #返回一系列可以作为命令的函数的字符串,三个双引号,表示三个双引号之间的内容都是一个 """Get all publicly accessible commands :returns: a list of string tuples (cmd, help), the method names who are decorated as commands """ get_method = lambda cmd: getattr(cls, cmd)#lambda匿名函数,定义了一个变量get_method,参数是cmd,直接调用getattr return sorted([(x.replace('_', '-'), get_method(x).__doc__.strip()) #遍历Manager对象的成员,如果成员又属性'publicly_accessible',该属性是在@command 中进行定义的而后面的for...语句,则是sort自定义的 #过滤执行体,符合条件的才会加入。则返回该成员,如果没有,则返回False,对于符合条件的成员则获得一个键值对,一个是名称如"start"一个是描述 for x in dir(cls) if getattr(get_method(x), 'publicly_accessible', False)])#
现整理代码如下:
import functools def command(func): func.publicly_accessible = True @functools.wraps(func) def wrapped(*a, **kw): rv = func(*a, **kw) return 1 if rv else 0 return wrapped class Manager(): "dasda" @command def status(self, **kwargs): 'miaoshustatus' print 'status' def start(self, **kwargs): 'miaoshustart' print 'start' def no_wait(self, **kwargs): 'miaoshunowait' print 'no_wait' def no_daemon(self, **kwargs): 'miaoshuno_daemon' print 'no_daemon' @classmethod def list_commands(cls): print getattr(getattr(cls,'status'),"publicly_accessible",False) get_method = lambda cmd: getattr(cls, cmd)#lambda匿名函数,定义了一个变量get_method,参数是cmd,直接调用getattr return sorted([(x.replace('_', '-'), get_method(x).__doc__.strip()) for x in dir(cls) if getattr(get_method(x), 'publicly_accessible', False)]) print Manager.list_commands()上述代码可以直接运行,这样我们就可以理解命令参数的问题了...
相关文章推荐
- python反射机制
- python反射机制
- Swift 反射机制,命名空间
- python的反射机制之getattr(), setattr(), hasattr(), delattr()
- 对于python的反射机制
- python的反射机制
- Python反射机制之setattr的使用
- Python学习心得(六) 反射机制、装饰器
- Python反射机制理解
- python的反射机制
- 简单谈谈python的反射机制
- python的反射机制
- python的反射机制
- 简单谈谈python的反射机制
- Python反射机制深入分析
- Swift 基本知识之十八 swift格式化输出和反射机制
- Swift-反射机制学习(简单实现Json格式与对象映射)
- Python 的反射机制
- 简单谈谈python的反射机制
- python使用反射机制实例化对象