由swift想到的-python反射机制

在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()
上述代码可以直接运行,这样我们就可以理解命令参数的问题了...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值