设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 365|回复: 0

[经验分享] 从pyh看Python的工厂模式

[复制链接]

尚未签到

发表于 2017-4-30 11:24:31 | 显示全部楼层 |阅读模式
【设想】
在做selenium前端页面测试时,想到生成html报告,需要编写个类,实现在Python内编辑html,具体思路如下:
1、编写各种tag类型,如head、title、body;
2、重载 + 运算,实现类似html + head的功能;
想到第一点,当时就觉得繁琐,要定义如此多个类(原谅我当时傻傻的),后来发现个开源项目:https://pypi.python.org/pypi/PyH/0.1
【PyH工厂模式解析】
PyH就一个源码pyh.py,很简单,以下截取部分代码分析,请尊重原作者,不要直接使用
定义一个基础类,并重载+操作符,重载<<重载符
[python] view plaincopy
class Tag(list):  
    tagname = ''  
      
    def __init__(self, *arg, **kw):  
        self.attributes = kw  
        if self.tagname :   
            name = self.tagname  
            self.isSeq = False  
        else:   
            name = 'sequence'  
            self.isSeq = True  
        self.id = kw.get('id', name)  
        #self.extend(arg)  
        for a in arg: self.addObj(a)  
  
    def __iadd__(self, obj):  
        if isinstance(obj, Tag) and obj.isSeq:  
            for o in obj: self.addObj(o)  
        else: self.addObj(obj)  
        return self  
      
    def addObj(self, obj):  
        if not isinstance(obj, Tag): obj = str(obj)  
        id=self.setID(obj)  
        setattr(self, id, obj)  
        self.append(obj)  
  
    def setID(self, obj):  
        if isinstance(obj, Tag):  
            id = obj.id  
            n = len([t for t in self if isinstance(t, Tag) and t.id.startswith(id)])  
        else:  
            id = 'content'  
            n = len([t for t in self if not isinstance(t, Tag)])  
        if n: id = '%s_%03i' % (id, n)  
        if isinstance(obj, Tag): obj.id = id  
        return id  
  
    def __add__(self, obj):  
        if self.tagname: return Tag(self, obj)  
        self.addObj(obj)  
        return self  
  
    def __lshift__(self, obj):  
        self += obj  
        if isinstance(obj, Tag): return obj  
  
    def render(self):  
        result = ''  
        if self.tagname:  
            result = '<%s%s%s>' % (self.tagname, self.renderAtt(), self.selfClose()*' /')  
        if not self.selfClose():  
            for c in self:  
                if isinstance(c, Tag):  
                    result += c.render()  
                else: result += c  
            if self.tagname:   
                result += '</%s>' % self.tagname  
        result += '\n'  
        return result  
  
    def renderAtt(self):  
        result = ''  
        for n, v in self.attributes.iteritems():  
            if n != 'txt' and n != 'open':  
                if n == 'cl': n = 'class'  
                result += ' %s="%s"' % (n, v)  
        return result  
  
    def selfClose(self):  
        return self.tagname in selfClose         

然后定义工厂类
[python] view plaincopy
def TagFactory(name):  
    class f(Tag):  
        tagname = name  
    f.__name__ = name  
    return f  

最后实现工厂模式
[python] view plaincopy
for t in tags: setattr(thisModule, t, TagFactory(t))   

【PyH生成html】
[python] view plaincopy
#生成一个page对象  
report_html = PyH(ur'乐视页面测试报告')  
'''''可以使用<<运算符往page类添加tag节点,可添加的如下
tags = ['html', 'body', 'head', 'link', 'meta', 'div', 'p', 'form', 'legend',  
        'input', 'select', 'span', 'b', 'i', 'option', 'img', 'script',
        'table', 'tr', 'td', 'th', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
        'fieldset', 'a', 'title', 'body', 'head', 'title', 'script', 'br', 'table',
        'ul', 'li', 'ol']
'''  
report_html << h1(u'乐视页面测试报告',cl='header1',style='color:red; text-align:center')  
#Tag对象,也可以使用<<往里面添加节点  
myul = report_html << ul(cl='ul_report')  
logintb = myul << table(cl='tb_login',border=2)  
logintb << tr(cl='tb_tr') << td(cl='tb_login_head') << p(u'登录测试用例: 1 个',style='color:blue; text-align:center')  
#最后使用printOut输出到文件或者console  
report_html.printOut('result.html')

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-371151-1-1.html 上篇帖子: Python中Sublime text环境配置 下篇帖子: python的强悍(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表