您的位置:首页 > 移动开发 > Swift

由swift想到的-python反射机制

2015-01-09 16:42 405 查看
在swift中的命令设置并没有进行字符串的定义,而是使用了python的反射机制,也即,命令参数,是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()
上述代码可以直接运行,这样我们就可以理解命令参数的问题了...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: