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)
  • 相关阅读:
    OpenJudge 6042 雇佣兵
    POJ 1741 树上 点的 分治
    Codevs 1695 Windows2013
    复制书稿
    乘积最大
    编辑距离问题
    石子合并
    最大正方形子矩阵
    选菜
    混合背包
  • 原文地址:https://www.cnblogs.com/Xjng/p/4023740.html
Copyright © 2011-2022 走看看