一个很神奇的类
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)