• 一个很神奇的类


    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)
  • 相关阅读:
    HTTP 03 HTTP 报文头
    HTTP 02 HTTP1.1 协议
    HTML 01 请求过程
    Java_异常_04_ OutOfMemoryError系列
    mq_学习_01_消息中间件的概述
    mq_学习_00_资源帖
    Java钉钉开发_异常_01_error code:50002, error message:请求的员工userid不在授权范围内
    Java_JS_01_java调用js
    JavaUtil_09_email_使用 commons-email 发送邮件
    JavaUtil_08_StringUtil_commons-lang3 之 StringUtils
  • 原文地址:https://www.cnblogs.com/Xjng/p/4023740.html
Copyright © 2020-2023  润新知