一个很神奇的类

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)
原文地址:https://www.cnblogs.com/Xjng/p/4023740.html