zoukankan      html  css  js  c++  java
  • 一个很神奇的类

    class Test():
        def __init__(self):
            pass
        def submit_job(self,func,*args):
            print func
            print args
    
        def __getattr__(self, name):
            ret=functools.partial(self.submit_job,name)
            return ret
    
    test=Test()
    test.aaaa('1',2,3)

     有些时候,例如用到工厂模式,或者调用webservice时,我们会把希望做的操作以字符串参数的形式,传给一个方法,

    ret=test.submit_job('read_a_file',file_name,file_path)

    但是这样的调用方式非常不直观

    我们更希望这样调用

    ret=test.read_a_file(file_name,file_path)

    就好更方便,直观,可读性也更好

    而上面的Test类就能实现这样的需求。

    但是当我们希望做的操作的名称是分级的,例如“read_a_file.readline”

    我们就不能用上面的类了,我们可以这样实现:

    class Automagic(object):
        """
        一个很神奇的类,
    """ def __init__(self, clientref, base): self.base = base self.clientref = clientref def __getattr__(self, name): base2 = self.base[:] base2.append(name) return Automagic(self.clientref, base2) def __call__(self, *args): if not self.base: raise AttributeError("something wrong here in Automagic __call__") if len(self.base) < 2: raise AttributeError("no method called: %s" % ".".join(self.base)) func = ".".join(self.base[0:]) return self.clientref.call_func(func, args) class Test(): def __init__(self): pass def submit_job(self, func, *args): print func print args def call_func(self, func, args): return self.submit_job(func, *args) def __getattr__(self, name): return Automagic(self, [name]) test = Test() test.aaaa.aa('1', 2, 3)
  • 相关阅读:
    System.setProperty()
    ExtJs自学教程(1):一切从API開始
    【福利!】英雄联盟国服更新补丁速度极慢的解决方法
    ORACLE触发器具体解释
    我的Hook学习笔记
    Runood-JSP:JSP 客户端请求
    Runoob-JSP:JSP 隐式对象
    Runoob-JSP:JSP 动做元素
    Runoob-JSP:JSP 指令
    Runoob-JSP:JSP 生命周期
  • 原文地址:https://www.cnblogs.com/Xjng/p/4023740.html
Copyright © 2011-2022 走看看